-
Notifications
You must be signed in to change notification settings - Fork 0
/
content.json
1 lines (1 loc) · 481 KB
/
content.json
1
{"meta":{"title":"Anoyer's Blog","subtitle":"","description":"一个ACMer的个人博客","author":"John Doe","url":"https://anoyer.cn"},"pages":[{"title":"","date":"2019-01-24T11:59:23.304Z","updated":"2018-11-29T04:34:06.081Z","comments":true,"path":"404.html","permalink":"https://anoyer.cn/404.html","excerpt":"","text":"404错误@import url('https://fonts.googleapis.com/css?family=Montserrat:400,600,700'); @import url('https://fonts.googleapis.com/css?family=Catamaran:400,800'); .error-container { text-align: center; font-size: 180px; font-family: 'Catamaran', sans-serif; font-weight: 800; margin: 20px 15px; } .error-container > span { display: inline-block; line-height: 0.7; position: relative; color: #FFB485; } .error-container > span { display: inline-block; position: relative; vertical-align: middle; } .error-container > span:nth-of-type(1) { color: #D1F2A5; animation: colordancing 4s infinite; } .error-container > span:nth-of-type(3) { color: #F56991; animation: colordancing2 4s infinite; } .error-container > span:nth-of-type(2) { width: 120px; height: 120px; border-radius: 999px; } .error-container > span:nth-of-type(2):before, .error-container > span:nth-of-type(2):after { border-radius: 0%; content:\"\"; position: absolute; top: 0; left: 0; width: inherit; height: inherit; border-radius: 999px; box-shadow: inset 30px 0 0 rgba(209, 242, 165, 0.4), inset 0 30px 0 rgba(239, 250, 180, 0.4), inset -30px 0 0 rgba(255, 196, 140, 0.4), inset 0 -30px 0 rgba(245, 105, 145, 0.4); animation: shadowsdancing 4s infinite; } .error-container > span:nth-of-type(2):before { -webkit-transform: rotate(45deg); -moz-transform: rotate(45deg); transform: rotate(45deg); } .screen-reader-text { position: absolute; top: -9999em; left: -9999em; } @keyframes shadowsdancing { 0% { box-shadow: inset 30px 0 0 rgba(209, 242, 165, 0.4), inset 0 30px 0 rgba(239, 250, 180, 0.4), inset -30px 0 0 rgba(255, 196, 140, 0.4), inset 0 -30px 0 rgba(245, 105, 145, 0.4); } 25% { box-shadow: inset 30px 0 0 rgba(245, 105, 145, 0.4), inset 0 30px 0 rgba(209, 242, 165, 0.4), inset -30px 0 0 rgba(239, 250, 180, 0.4), inset 0 -30px 0 rgba(255, 196, 140, 0.4); } 50% { box-shadow: inset 30px 0 0 rgba(255, 196, 140, 0.4), inset 0 30px 0 rgba(245, 105, 145, 0.4), inset -30px 0 0 rgba(209, 242, 165, 0.4), inset 0 -30px 0 rgba(239, 250, 180, 0.4); } 75% { box-shadow: inset 30px 0 0 rgba(239, 250, 180, 0.4), inset 0 30px 0 rgba(255, 196, 140, 0.4), inset -30px 0 0 rgba(245, 105, 145, 0.4), inset 0 -30px 0 rgba(209, 242, 165, 0.4); } 100% { box-shadow: inset 30px 0 0 rgba(209, 242, 165, 0.4), inset 0 30px 0 rgba(239, 250, 180, 0.4), inset -30px 0 0 rgba(255, 196, 140, 0.4), inset 0 -30px 0 rgba(245, 105, 145, 0.4); } } @keyframes colordancing { 0% { color: #D1F2A5; } 25% { color: #F56991; } 50% { color: #FFC48C; } 75% { color: #EFFAB4; } 100% { color: #D1F2A5; } } @keyframes colordancing2 { 0% { color: #FFC48C; } 25% { color: #EFFAB4; } 50% { color: #D1F2A5; } 75% { color: #F56991; } 100% { color: #FFC48C; } } /* demo stuff */ * { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } body { background-color: #666666; margin-bottom: 50px; } html, button, input, select, textarea { font-family: 'Montserrat', Helvetica, sans-serif; color: #92a4ad; } h1 { text-align: center; margin: 30px 15px; } .zoom-area { max-width: 490px; margin: 30px auto 30px; font-size: 19px; text-align: center; } .link-container { text-align: center; } a.more-link { text-transform: uppercase; font-size: 13px; background-color: #92a4ad; padding: 10px 15px; border-radius: 0; color: #416475; display: inline-block; margin-right: 5px; margin-bottom: 5px; line-height: 1.5; text-decoration: none; margin-top: 50px; letter-spacing: 1px; } .button { background-color: #4CAF50; /* Green */ border: none; color: white; padding: 16px 32px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; margin: 4px 2px; -webkit-transition-duration: 0.4s; /* Safari */ transition-duration: 0.4s; cursor: pointer; border-radius: 50px; } .button1 { background-color: #666666; color: #00B09F; border: 2px solid #00B09F; } .button1:hover { background-color: #00B09F; color: white; }4 0 4木有找到你所请求的页面"},{"title":"","date":"2018-09-15T03:49:07.000Z","updated":"2018-12-03T04:09:47.428Z","comments":false,"path":"about/index.html","permalink":"https://anoyer.cn/about/index.html","excerpt":"","text":"本人介绍一名大闲人在役ACMer铁牌选手有点强迫症喜欢HIFI喜欢旅游收藏名言“今日的我要超越昨日的我,明日的我要胜过今日的我”“人一我百!人十我万!永不放弃~~~怀着自信的心,去追逐梦想”“咕咕咕”“人类的本质是复读机”“过不了就是OJ有问题”联系方式Github:@AnoyerWeiBo:@Anoy_虚伪QQ:@在头像下方在线联系E-Mail:[email protected]本站备用站点CSDN: https://me.csdn.net/Anoy_acer"},{"title":"categories","date":"2018-09-15T02:29:41.000Z","updated":"2018-09-15T02:30:42.835Z","comments":true,"path":"categories/index.html","permalink":"https://anoyer.cn/categories/index.html","excerpt":"","text":""},{"title":"为什么在Coding上搭建的博客有时打不开呢?","date":"2018-12-08T07:50:18.000Z","updated":"2018-12-08T09:42:36.432Z","comments":true,"path":"article/201812081538.html","permalink":"https://anoyer.cn/article/201812081538.html","excerpt":"","text":"今天(2018年12月8日),大概过了中午之后Coding的pages服务又出现了瘫痪现象,ping了下域名,整个地图全爆红。与上次Coding瘫痪(2018年11月18日下午)的情况基本一致。上一次Coding瘫痪的第二天中午我就联系了Coding的客服,以下是我和客服的聊天记录请大家过目,别的我也就不多说的,因为我早不信任它了。"},{"title":"","date":"2018-09-16T14:15:00.000Z","updated":"2018-12-01T16:39:40.756Z","comments":false,"path":"check-link/index.html","permalink":"https://anoyer.cn/check-link/index.html","excerpt":"","text":"友链检查记录以下是各个友链的撤链信息,若需恢复友链请联系我本人名称网址撤链原因撤链时间能否恢复阳一的博客http://www.heyangli.com链接错误2018.11.26能帖子http://www.tiezi.xyz链接错误2018.11.26能JasonYu的博客https://www.yuhuizhen.com/未加链接2018.11.26能JunMohttps://mo3.top/未加友链2018.11.26能最初的墨https://www.taitan.tech/域名错误2018.11.20能"},{"title":"","date":"2018-12-02T15:22:36.000Z","updated":"2018-12-03T14:24:55.671Z","comments":false,"path":"Library/index.html","permalink":"https://anoyer.cn/Library/index.html","excerpt":"","text":"此页会不定时的发布各种学习资料,内容涵盖ACM模板、C/C++学习资料、数据结构学习资料、各种IT类学习资料…等等等等,资源会以直链、软件官网、网盘等形式提供下载。温馨提示如果你发现有资源无法下载或者资源失效等情况可以联系我,我会马上进行处理。本站保证站内提供的所有可下载资源(软件等等)都是按”原样”提供,本站未做过任何改动;但不保证本站提供的下载资源的准确性、安全性和完整性;同时本站也不承担用户因使用这些下载的资源对自己和他人造成任何形式的损失或伤害。本站上的所有资源均来自互联网,仅供学习和研究使用,不得用于任何商业用途。如有侵犯你版权的,请联系我本人,本站将立即更改。ACM模板ACM算法模板ACM及算法学习书籍ACM模板-f_zyj[挑战程序设计竞赛(第2版)].巫泽俊ACM模板Deeplearning深度学习笔记v5.41kuangbin的ACM模板(新)027933-算法设计与分析基础 第二版[hejizhan.com]ACM模版-sxy算法导论_原书第3版_CHSACM模板-Anoyer刘汝佳《算法艺术与信息学竞赛》电子版oeis核心数列网算法竞赛入门经典 紫书dp进阶之路国际大学生程序设计竞赛指南IT类学习资料汇集C/C++学习资料数据结构学习资料狂人C程序员入门必备【大话数据结构】程杰C和指针(中文版)C陷阱与缺陷C专家编程C语言与C++语言程序设计其他学习资料英语Github入门教程四级单词一笑而过-俞敏洪亲笔力荐的词汇宝典从+0+开始学习+GitHub+系列视频学习资源C语言C++学习指南2017(零基础入门)Python全能自动化开发-基础入门汇编语言视频课程oeasy的ps教程,我们一起来玩ps(photoshop)"},{"title":"","date":"2019-01-24T11:59:23.966Z","updated":"2018-11-21T11:27:50.515Z","comments":true,"path":"js/back.top.js","permalink":"https://anoyer.cn/js/back.top.js","excerpt":"","text":"$(document).ready(function($){ // browser window scroll (in pixels) after which the \"back to top\" link is shown var offset = 300, //duration of the top scrolling animation (in ms) scroll_top_duration = 200, //grab the \"back to top\" link $back_to_top = $('.cd-top'); //hide or show the \"back to top\" link $(window).scroll(function(){ ( $(this).scrollTop() > offset ) ? $back_to_top.addClass('cd-is-visible') : $back_to_top.removeClass('cd-is-visible cd-fade-out'); }); //smooth scroll to top $back_to_top.on('click', function(event){ event.preventDefault(); $('body,html').animate({ scrollTop: 0 , }, scroll_top_duration ); }); });"},{"title":"","date":"2019-01-24T11:59:23.970Z","updated":"2018-11-26T02:26:20.273Z","comments":true,"path":"js/get.time.js","permalink":"https://anoyer.cn/js/get.time.js","excerpt":"","text":"function clock_12h() { var today = new Date(); //获得当前时间 //获得年、月、日,Date()函数中的月份是从0-11计算 var year = today.getFullYear(); var month = today.getMonth()+1; var date = today.getDate(); var hour = today.getHours(); //获得小时、分钟、秒 var minute = today.getMinutes(); var second = today.getSeconds(); var apm=\"AM\"; //默认显示上午: AM if (hour>12) //按12小时制显示 { hour=hour-12; apm=\"PM\" ; } var weekday = 0; switch(today.getDay()){ case 0: weekday = \"星期日\"; break; case 1: weekday = \"星期一\"; break; case 2: weekday = \"星期二\"; break; case 3: weekday = \"星期三\"; break; case 4: weekday = \"星期四\"; break; case 5: weekday = \"星期五\"; break; case 6: weekday = \"星期六\"; break; } /*设置div的内容为当前时间*/ document.getElementById(\"myclock\").innerHTML=\"\"+year+\"年\"+month+\"月\"+date+\"日\"+weekday; } /*使用setInterval()每间隔指定毫秒后调用clock_12h()*/ var myTime = setInterval(\"clock_12h()\",1000);"},{"title":"","date":"2019-01-24T11:59:23.982Z","updated":"2019-01-22T14:36:26.547Z","comments":false,"path":"links/index.html","permalink":"https://anoyer.cn/links/index.html","excerpt":"","text":"友 链海内存知己,天涯若比邻——以下为各位小白大佬的友链,优秀的博客友链还会放在博客的页脚哟~如果需要申请友链可以点击最下方的申请按钮!头像名称网站Anoyerhttps://blog.csdn.net/Anoy_acerf_zyjhttps://me.csdn.net/f_zyjCaprYanghttps://blog.csdn.net/CaprYangAererhttps://me.csdn.net/qq_41785863Leon_ldyhttps://blog.csdn.net/iamldyxumengnanhttps://blog.csdn.net/qq_40727946wzazzyhttps://blog.csdn.net/wzazzySXYhttps://orzsxy.github.ioCupccinohttps://me.csdn.net/qq_39898553小吴博客https://www.wushile.tophandsomehttps://www.ihewro.comChungZHhttps://chungzh.cnMitscherlichhttps://mitscherlich.me/申请友情链接"},{"title":"","date":"2019-01-24T11:59:23.967Z","updated":"2018-11-23T01:04:46.056Z","comments":true,"path":"js/cover.js","permalink":"https://anoyer.cn/js/cover.js","excerpt":"","text":"var brightness; //��ʾ���� function cover(brightness) { if (typeof(div) == 'undefined') { div = document.createElement('div'); div.setAttribute('style', 'position:fixed;top:0;left:0;outline:5000px solid;z-index:99999;'); document.body.appendChild(div); } else { div.style.display = ''; } div.style.outlineColor = 'rgba(0,0,0,' + brightness + ')'; } //�¼����� window.addEventListener('keydown', function(e) { if (e.altKey && e.keyCode == 90) { //Alt+Z:��ҹ��ģʽ cover(brightness = 0.3); } if (e.altKey && e.keyCode == 88) { //Alt+X:�ر� cover(brightness = 0); } if (e.altKey && e.keyCode == 38) { //Alt+��:�������� if (brightness - 0.05 > 0.05) cover(brightness -= 0.05); } if (e.altKey && e.keyCode == 40) { //Alt+��:�������� if (brightness + 0.05 < 0.95) cover(brightness += 0.05); } }, false);"},{"title":"","date":"2018-09-16T14:15:00.000Z","updated":"2018-12-02T09:04:11.086Z","comments":false,"path":"link-sq/index.html","permalink":"https://anoyer.cn/link-sq/index.html","excerpt":"","text":"申请友情链接申请条件必须是非营利性且可以稳定运营的网站。网站内90%的内容属于原创,只接受博客网站,技术类博客优先。不接受包含色情、毒品、恐怖、赌博等含有违法内容以及包含大量广告的网站。不接受通过第三方网站代建平台(如“凡科建站”、“搜狐快站”等)搭建的博客网站。网站内容需要经常更新。申请须知友情链接只是结交朋友,而不是为了SEO。单方若需要撤销友链务必先通知另一方。除特殊友链外,友情链接都按正常顺序排列,不分排名前后。本博客将不定时对无法访问或含有违规内容以及私自撤链的网址,进行清理。在申请前请先将本博客添加至你博客的友情链接栏目中,在24小时内不要删除(我会在24小时内查收邮件)。本博客会精选出优质博客将其链接会另外在网站页脚显示,链接也会定期检查和重选。若发现我方先行撤链,请进入检查记录页面查看撤链的原因。后需恢复友链请联系我本人。阅读友情链接的申请条件和须知后可点击下方的申请按钮,浏览器会自动启动你客户端的邮件程序并自动载入申请模板,你只需在模板中填写博客地址和名称即可,若浏览器未成功启动邮件程序,请确认客户端是否已安装了邮件程序并绑定了自己的邮箱账号。当然,你也可以直接通过博主的联系方式来联系我交换友链,但必须需要说明你的博客名称和博客地址。申 请 友 情 链 接"},{"title":"","date":"2019-01-24T11:59:23.992Z","updated":"2018-12-02T08:43:55.253Z","comments":false,"path":"statement/index.html","permalink":"https://anoyer.cn/statement/index.html","excerpt":"","text":"网站声明本博客属个人所有,不涉及商业目的,非经允许,不得用于盈利目的。原创声明本站大部分内容属于原创,凡是本站发表的内容,请大家在转载的时候声明原文出处。博客中的所有文章或者本站的其他页面中使用的大部分图片或图标来自于网络,如果侵权与[email protected]联系删除!转载声明转载本站文章可酌情修改内容,但需保证文章的语义完整性,以免让读者错误理会作者的真实意图。修改内容需通知源作者。任何转载自其他站点的文章,本站都会在文章结尾处声明原文链接,如果您的文章不希望被我转载,请及时联系我进行删除处理。评论审核制度任何评论无需审核即可通过评论,如发现有恶意评论以及垃圾评论我会及时处理掉。本人不会以任何理由在任何页面留下恶意评论、诽谤、谩骂,也不会留下任何对您有不良影响的评论,如果您发现有人盗用我的名义用来进行恶意评论,希望您能及时联系我,谢谢!"},{"title":"tags","date":"2018-09-15T02:31:15.000Z","updated":"2018-09-15T02:31:46.964Z","comments":true,"path":"tags/index.html","permalink":"https://anoyer.cn/tags/index.html","excerpt":"","text":""},{"title":"","date":"2018-09-15T03:50:12.000Z","updated":"2018-12-03T14:25:00.153Z","comments":false,"path":"resources/index.html","permalink":"https://anoyer.cn/resources/index.html","excerpt":"这是藏有博主不可告人密码的小仓库哦。","text":"这是藏有博主不可告人密码的小仓库哦。 Incorrect Password! No content to display! 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"}],"posts":[{"title":"河南农大算法训练赛三月周赛-0310","slug":"henau-0310","date":"2019-03-10T13:46:19.000Z","updated":"2019-03-10T14:00:21.634Z","comments":true,"path":"article/henau-0310.html","link":"","permalink":"https://anoyer.cn/article/henau-0310.html","excerpt":"","text":"A - 打理机房题意:给一个字符串,如果大写数比小写数多,全部转化成大写,否则全部小写。题解:遍历一遍字符串,用cnts和cntb记录大小写数量,最后对比调用strupr,strlwr12345678910111213141516#include<stdio.h>#include<bits/stdc++.h>using namespace std;char s[120];int main(){ cin>>s; int cnts=0,cntb=0; for(int i=0;s[i];i++){ if(s[i]>='a'&&s[i]<='z')cnts++; else if(s[i]>='A'&&s[i]<='Z')cntb++; } if(cntb>cnts)strupr(s); else strlwr(s); cout<<s<<endl;}B - Anoyer的生日礼物题意:给你一个整数,如果为负数允许你从倒数第一位或者倒数第二位删除一个数字,使值最大题解:算出删倒一和倒二的值,对比下大写123456789101112131415#include<stdio.h>#include<bits/stdc++.h>using namespace std;char s[20];int main(){ cin>>s; bool flag=0; if(s[0]!='-')cout<<s<<endl; else{ int a=atoi(s+1); int b=a%10+a/100*10,c=a/10; if(b>c)cout<<c*-1<<endl; else cout<<b*-1<<endl; }}C - 郑州地铁新干线题意:给你一个环,已知环上相邻两点的距离,求a到b的最短路径题解:一共就两种路径,从a顺时针或者逆时针。都求出来比大小就可以12345678910111213141516171819202122#include<stdio.h>#include<bits/stdc++.h>using namespace std;int d[120];int main(){ int n; cin>>n; for(int i=0;i<n;i++)cin>>d[i]; int a,b,lena=0,lenb=0; cin>>a>>b; if(a>b)swap(a,b); for(int i=a-1;;i++){ if(i%n==b-1)break; lena+=d[i%n]; } for(int i=b-1;;i++){ if(i%n==a-1)break; lenb+=d[i%n]; } cout<<min(lena,lenb)<<endl; return 0;}D - 区间覆盖题意:给你n个线段,问是否有一个的线段能覆盖其他线段,能输出线段位置,不能输出-1题解:直接模拟求,如果定义最大区间[mina,maxb],如果发现一个线段包括了这个最大区间,则flag=位置,同时更换区间1234567891011121314151617181920212223242526272829303132#include<stdio.h>#include<bits/stdc++.h>using namespace std;const int maxn=1e5+7;struct Node{ int a,b;}line[maxn];int main(){ int n,a=0,b=0,mina,maxb,flag=1; scanf(\"%d\",&n); scanf(\"%d%d\",&a,&b); //初始将第一组设成答案 mina=a,maxb=b; for(int i=1;i<n;i++){ scanf(\"%d%d\",&a,&b); if(a<=mina&&b>=maxb){ //如果能出现覆盖的线,flag记录位置,替换mina和maxb flag=i+1; mina=a,maxb=b; } else{ if(a<mina){ //如果出现比mina小的替换mina flag=-1; mina=a; } if(b>maxb){ //如果出现比minb大的替换minb flag=-1; maxb=b; } } } cout<<flag<<endl;}E - 电路阻抗题意:给定电阻r0=1,通过并联串联,问最少需要多少个r0能组成a/b题解:对a/b进行分解,等于d+c/b,因为d表示串联d个电阻,c/d表示并联了一个b/c的电子原件。对这个原件在进行分解,一直分解到c能整除b1234567891011121314#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;int main(){ ll a,b,cnt=0; cin>>a>>b; while(b){ cnt+=a/b; a=a%b; swap(a,b); } cout<<cnt<<endl;}G - XX输入法的的纠错算法题意:单词需要校对,把错误的改成正确的,错误单词的标准是: 1.有三个连续相同的字母,如www; 2.有多对有两个连续相同的字母,如aamm题解:用s2存当前去错后的串,看看压入s1[i]到s2中是否会成为一个错误单词,如果会就continue,否则压入123456789101112131415161718192021#include<stdio.h>#include<bits/stdc++.h>using namespace std;const int maxn=2e5+7;char s1[maxn],s2[maxn];int main(){ scanf(\"%s\",s1); int len=strlen(s1); int top=0; s2[top++]=s1[0]; s2[top++]=s1[1]; for(int i=2;i<len;i++){ if(s1[i]==s2[top-1]&&s2[top-1]==s2[top-2])continue; //3个相等 else if(s1[i]==s2[top-1]&&s2[top-2]==s2[top-3])continue; s2[top++]=s1[i]; } s2[top++]='\\0'; printf(\"%s\\n\",s2); return 0;}H - 简单的构造题意:给两个数a和b,可以打乱a每位数的顺序组成一个新的数c,求满足c<=b的最大,保证结果一定存在。题解:如果a的长度小于b,则直接输出a升序后的逆序;如果lena==lenb,遍历b,从0号位开始尽可能的让a[i]==b[i],如果发现没有a中已经没有b[i]数字则挑一个比b[i]小的最大的数(如果发现找不到小的就返回去查),放进去。然后剩余的数字就可以从大到小放12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;string a,b,c;int numa[10];int main(){ cin>>a>>b; int lena=a.size(),lenb=b.size(); for(int i=0;i<lena;i++){ numa[a[i]-'0']++; } if(lena<lenb){ sort(a.begin(),a.end()); reverse(a.begin(),a.end()); cout<<a<<endl; } else{ c=\"\"; bool flag=0; for(int i=0;i<lenb;i++){ if(numa[b[i]-'0']){ c+=b[i]; numa[b[i]-'0']--; } else{ bool th=1; //标记是否替换 for(int j=b[i]-'0';j>=0;j--){ if(numa[j]){ c+=j+'0'; numa[j]--; flag=1; th=0; break; } } while(th){ //没有替换前面一位换个小的 for(int j=b[i-1]-'0'-1;j>=0;j--){ if(numa[j]){ c[i-1]=j+'0'; numa[j]--; numa[b[i-1]-'0']++; flag=1; th=0; break; } } if(th){ c.erase(c.end() - 1); //删除最后一个字符 numa[b[i-1]-'0']++; i-=1; } } } if(flag)break; } cout<<c; if(flag){ for(int i=9;i>=0;i--){ while(numa[i]--){ cout<<i; } } } cout<<endl; }}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"河南农业大学训练赛题解","slug":"河南农业大学训练赛题解","permalink":"https://anoyer.cn/tags/河南农业大学训练赛题解/"}]},{"title":"ZZULI-2019年3月份月赛(个人赛)EF题解","slug":"zzuli-302","date":"2019-03-03T11:36:14.000Z","updated":"2019-03-03T11:59:06.172Z","comments":true,"path":"article/zzuli-302.html","link":"","permalink":"https://anoyer.cn/article/zzuli-302.html","excerpt":"","text":"问题 E: 小P的字母子串题意:给一段01串从任意位置进行截取,问最多能截取出多少个7位串对应字母的ASCLL值题解:利用map将所有字母的7位ASCALL值存起来,然后对字符串进行暴力7位一截取。看看截取出来的串是否是字母的ASCALL值,如果是则位置i+6(因为有for里i++,会再加1),ans++。对于字母的ASCALL,可以写个10进制转2进制程序跑一遍,输出到文件。或者手动转化’a’,’A’的二进制然后往后推251234567891011121314151617181920212223242526272829303132333435#include<stdio.h>#include<bits/stdc++.h>#define ll long long int#define max_n 10050 //串长度#define max_tot 100050 //节点数#define met(a) memset(a,0,sizeof(a))#define fup(i,a,n,b) for(int i=a;i<n;i+=b)#define fow(j,a,n,b) for(int j=a;j>0;j-=b)#define MOD(x) (x)%modusing namespace std;const int maxn = 1e4 + 7;string s;string zm[60]={\"1000001\",\"1000010\",\"1000011\",\"1000100\",\"1000101\",\"1000110\",\"1000111\",\"1001000\",\"1001001\",\"1001010\",\"1001011\",\"1001100\",\"1001101\",\"1001110\",\"1001111\",\"1010000\",\"1010001\",\"1010010\",\"1010011\",\"1010100\",\"1010101\",\"1010110\",\"1010111\",\"1011000\",\"1011001\",\"1011010\",\"1100001\",\"1100010\",\"1100011\",\"1100100\",\"1100101\",\"1100110\",\"1100111\",\"1101000\",\"1101001\",\"1101010\",\"1101011\",\"1101100\",\"1101101\",\"1101110\",\"1101111\",\"1110000\",\"1110001\",\"1110010\",\"1110011\",\"1110100\",\"1110101\",\"1110110\",\"1110111\",\"1111000\",\"1111001\",\"1111010\"};map<string,int>mp;int main(int argc, char *argv[]) { for(int i=0;i<52;i++){ mp[zm[i]]=1; //把所有字母的ASCALL值扔进map } while(cin>>s){ int ans=0; int len=s.size(); string sub; for(int i=0;i+6<len;i++){ if(s[i]==0)continue; else{ sub=s.substr(i,7); //截取7位子串 if(mp[sub])ans++,i+=6; //判断是不是个字母 } } cout<<ans<<endl; } //cout<<s<<endl; return 0;}问题 F: 小P的秘籍题意:给一个长度为n的AK串,求一个长度为len的子串满足该子串的所有前缀和后缀中K的数量不小于A,求最大len题解:数据水了,用的尺取法。题目要求从前往后和从后往前都要满足K的数量大于等于A的数量。先用尺取法来确定从前往后满足的区间,然后内部从后往前判断是否成立,成立了就更新答案12345678910111213141516171819202122232425262728293031323334353637#include<bits/stdc++.h> using namespace std; int main(){ int n; cin>>n; string str; cin>>str; int i=0,j=0;//[i,j] int a=0,k=0; int ans=0; while(1){ while(j<str.size()&&k>=a){ if(str[j]=='A')a++; if(str[j]=='K')k++; j++; if(k>=a){ int cnt=0; for(int r=j-1;r>=i;r--){ if(str[r]=='A')cnt--; if(str[r]=='K')cnt++; if(cnt<0)break; } if(cnt>=0)ans=max(ans,j-i); } } if(k>=a)break; while(i<j && k<a){ if(str[i]=='A')a--; if(str[i]=='K')k--; i++; } } cout<<ans<<endl; return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"河南农业大学训练赛题解","slug":"河南农业大学训练赛题解","permalink":"https://anoyer.cn/tags/河南农业大学训练赛题解/"}]},{"title":"UVA - 11624 - Fire!(BFS逃生问题)","slug":"UVA-11624-Fire","date":"2019-02-25T09:40:34.000Z","updated":"2019-02-25T09:50:13.223Z","comments":true,"path":"article/UVA-11624-Fire.html","link":"","permalink":"https://anoyer.cn/article/UVA-11624-Fire.html","excerpt":"","text":"题目链接题意:在迷宫内,J表示人,F表示火,火可能不止一处,但是人只有一个,火会向上下左右蔓延,蔓延速度和人移动速度一至(每次一格,但是可以同时向四个方向)问是否可以成功逃出迷宫,不能输出IMPOSSIBLE,能的画话输出最短路径。题解:每步先让火走–然后人走其他的路–就可以保证人不会被火烧了先将火入队列最后将人入队列,走的时候判断下是人还是火,如果是人的话看看是否无路可走注:也可以跑两次BFS,先跑火,再跑人,看人到当前格时间是否小于火的AC代码:1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283#include<cstdio>#include<queue>#include<cstring>#include<algorithm>using namespace std;char ma[1010][1010];int n,m,rx,ry,fx,fy;int xx[4]={0,0,1,-1};int yy[4]={1,-1,0,0};struct node{ int x,y,step; bool fafe;}now,qian,ff;int bfs(){ queue <node> que; for (int i=0;i<n;i++) for (int j=0;j<m;j++){ if (ma[i][j]=='F'){ now.x=i;now.y=j;now.step=0; now.fafe=true; que.push(now); ma[i][j]='#'; } } now.x=rx;now.y=ry;now.step=0;now.fafe=false; que.push(now); while (!que.empty()){ now=que.front(); que.pop(); if (now.fafe){ for (int i=0;i<4;i++){ int kx=now.x+xx[i]; int ky=now.y+yy[i]; if (kx<0||ky<0||kx==n||ky==m||ma[kx][ky]=='#') continue; { ma[kx][ky]='#'; qian.x=kx;qian.y=ky; qian.step=now.step+1; qian.fafe=true; que.push(qian); } } } else{ for (int i=0;i<4;i++){ int kx=now.x+xx[i]; int ky=now.y+yy[i]; if (kx<0||ky<0||kx==n||ky==m){ return now.step+1; } if (ma[kx][ky]!='#'){ ma[kx][ky]='#'; qian.x=kx;qian.y=ky; qian.step=now.step+1; qian.fafe=false; que.push(qian); } } } } return 0;}int main(){ int t;scanf(\"%d\",&t); while (t--){ scanf(\"%d%d\",&n,&m); for (int i=0;i<n;i++){ scanf(\"%s\",ma[i]); for (int j=0;j<m;j++){ if (ma[i][j]=='J'){ rx=i;ry=j; ma[i][j]='#'; } } } int ans=bfs(); if (ans) printf(\"%d\\n\",ans); else printf(\"IMPOSSIBLE\\n\"); } return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"BFS","slug":"BFS","permalink":"https://anoyer.cn/tags/BFS/"},{"name":"UVA","slug":"UVA","permalink":"https://anoyer.cn/tags/UVA/"}]},{"title":"POJ - 3984 - 迷宫问题(路径记录)","slug":"POJ-3984","date":"2019-02-25T09:36:16.000Z","updated":"2019-02-25T09:49:54.260Z","comments":true,"path":"article/POJ-3984.html","link":"","permalink":"https://anoyer.cn/article/POJ-3984.html","excerpt":"","text":"题目链接题意:给你一个5*5的迷宫,0代表通路,1代表墙,找到从迷宫左上角到达右下角的最短路径,并输出路径。题解:先进行一遍BFS,得到vis数组,表示到该位置最少需要多少时间,然后从(4,4)位置倒着查路径,查到符合的就直接break,防止重复AC代码:12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364#include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>#include<queue>#include<stack>using namespace std;typedef long long ll;const int maxn=7;struct node{ int x,y; node(int i=0,int j=0){x=i,y=j;};};int mp[maxn][maxn];int vis[maxn][maxn];int dis[4][2]={1,0,-1,0,0,1,0,-1};void bfs(){ queue<node>dq; node now(0,0),nex; dq.push(now); vis[0][0]=1; while(!dq.empty()){ now=dq.front(); dq.pop(); for(int i=0;i<4;i++){ nex.x=now.x+dis[i][0]; nex.y=now.y+dis[i][1]; if(nex.x>=0&&nex.x<5&&nex.y>=0&&nex.y<5&&mp[nex.x][nex.y]==0&&vis[nex.x][nex.y]==0){ dq.push(nex); vis[nex.x][nex.y]=vis[now.x][now.y]+1; if(nex.x==4&&nex.y==4)return; } } }}int main(){ stack<node>ds; for(int i=0;i<5;i++) for(int j=0;j<5;j++)scanf(\"%d\",&mp[i][j]); bfs(); node nw(4,4),ne; int ans=vis[4][4]; ds.push(nw); while(true){ for(int i=0;i<5;i++){ ne.x=nw.x+dis[i][0]; ne.y=nw.y+dis[i][1]; if(ne.x>=0&&ne.x<5&&ne.y>=0&&ne.y<5&&vis[ne.x][ne.y]==ans-1){ nw=ne; ans=ans-1; ds.push(nw); break; } } if(nw.x==0&&nw.y==0)break; } while(!ds.empty()){ nw=ds.top(); ds.pop(); printf(\"(%d, %d)\\n\",nw.x,nw.y); } return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"BFS","slug":"BFS","permalink":"https://anoyer.cn/tags/BFS/"},{"name":"POJ","slug":"POJ","permalink":"https://anoyer.cn/tags/POJ/"}]},{"title":"POJ - 3278 - Catch That Cow(裸BFS)","slug":"POJ-3278-Catch-That-Cow","date":"2019-02-25T09:29:05.000Z","updated":"2019-02-25T09:35:30.552Z","comments":true,"path":"article/POJ-3278-Catch-That-Cow.html","link":"","permalink":"https://anoyer.cn/article/POJ-3278-Catch-That-Cow.html","excerpt":"","text":"题目链接题意:给定两个整数n和k,通过 n+1或n-1 或n*2 这3种操作,使得n==k,输出最少的操作次数题解:简单的对每个节点进行三个方向(三种走法)的BFSAC代码:12345678910111213141516171819202122232425262728293031323334353637383940414243#include<stdio.h>#include<string.h>#include<queue>#include<algorithm>using namespace std;typedef long long ll;const int maxn=100005;int vis[maxn];int n,k;int bfs(){ queue<int>dq; dq.push(n); vis[n]=1; while(!dq.empty()){ int x=dq.front(); dq.pop(); if(x+1>=0&&x+1<maxn&&vis[x+1]==0){ dq.push(x+1); vis[x+1]=vis[x]+1; if(x+1==k)return vis[x+1]; } if(x-1>=0&&x-1<maxn&&vis[x-1]==0){ dq.push(x-1); vis[x-1]=vis[x]+1; if(x-1==k)return vis[x-1]; } if(2*x>=0&&2*x<maxn&&vis[2*x]==0){ dq.push(2*x); vis[2*x]=vis[x]+1; if(2*x==k)return vis[2*x]; } }}int main(){ scanf(\"%d%d\",&n,&k); if(n>=k){ printf(\"%d\\n\",n-k); return 0; } int ans=bfs(); printf(\"%d\\n\",ans-1);}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"BFS","slug":"BFS","permalink":"https://anoyer.cn/tags/BFS/"},{"name":"POJ","slug":"POJ","permalink":"https://anoyer.cn/tags/POJ/"}]},{"title":"POJ - 3126 - Prime Path(BFS枚举)","slug":"POJ-3126-Prime-Path","date":"2019-02-25T09:24:31.000Z","updated":"2019-02-25T09:28:46.369Z","comments":true,"path":"article/POJ-3126-Prime-Path.html","link":"","permalink":"https://anoyer.cn/article/POJ-3126-Prime-Path.html","excerpt":"","text":"题目链接题意:给出两个四位数的素数a,b,求从a变到b最少要花几步?每一步只能将a中的一位改变,且改变后的数也要是素数。题解:BFS枚举个位,十位,百位,千位变换的数,用素数表判断变换后是否为一个素数AC代码:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475#include<stdio.h>#include<string.h>#include<queue>#include<algorithm>using namespace std;typedef long long ll;const int maxn=1e4+5;bool prime[maxn];int vis[maxn];void Prime(){ prime[0]=prime[1]=1; for(int i=2;i<maxn;i++){ if(!prime[i]) for(int j=2;j*i<maxn;j++)prime[i*j]=1; }}int n,m;int bfs(){ int ans=0; queue<int>dq; dq.push(n); vis[n]=1; if(n==m)return vis[n]; while(!dq.empty()){ int x=dq.front(); dq.pop(); if(x==m)return vis[x]; for(int i=1;i<10;i+=2){ //个位 int xx=x-x%10+i; if(!prime[xx]&&vis[xx]==0){ dq.push(xx); vis[xx]=vis[x]+1; if(xx==m)return vis[xx]; } } for(int i=0;i<10;i++){ //十位 int xx=x-(x%100-x%10)+i*10; if(!prime[xx]&&vis[xx]==0){ dq.push(xx); vis[xx]=vis[x]+1; if(xx==m)return vis[xx]; } } for(int i=0;i<10;i++){ //百位 int xx=x-(x%1000-x%100)+i*100; if(!prime[xx]&&vis[xx]==0){ dq.push(xx); vis[xx]=vis[x]+1; if(xx==m)return vis[xx]; } } for(int i=1;i<10;i++){ //千位 int xx=x-(x%10000-x%1000)+i*1000; if(!prime[xx]&&vis[xx]==0){ dq.push(xx); vis[xx]=vis[x]+1; if(xx==m)return vis[xx]; } } } return -1;}int main(){ Prime(); int t; scanf(\"%d\",&t); while(t--){ memset(vis,0,sizeof(vis)); scanf(\"%d%d\",&n,&m); int ans=bfs(); if(ans==-1)printf(\"Impossible\\n\"); else printf(\"%d\\n\",ans-1); } return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"BFS","slug":"BFS","permalink":"https://anoyer.cn/tags/BFS/"},{"name":"POJ","slug":"POJ","permalink":"https://anoyer.cn/tags/POJ/"}]},{"title":"POJ - 3087 - Shuffle'm Up(模拟)","slug":"POJ-3087-Shuffle-m-Up","date":"2019-02-25T09:18:44.000Z","updated":"2019-02-25T09:49:13.488Z","comments":true,"path":"article/POJ-3087-Shuffle-m-Up.html","link":"","permalink":"https://anoyer.cn/article/POJ-3087-Shuffle-m-Up.html","excerpt":"","text":"题目链接题意:已知两堆牌s1和s2的初始状态, 其牌数均为c,按给定规则能将他们相互交叉组合成一堆牌s12,再将s12的最底下的c块牌归为s1,最顶的c块牌归为s2,依此循环下去。现在输入s1和s2的初始状态 以及 预想的最终状态s12问s1 s2经过多少次洗牌之后,最终能达到状态s12,若永远不可能相同,则输出”-1”。题解:虽然归类于kuangbin搜索专题,但个人感觉模拟更好做,直接用map判重,进行模拟就可以。如果出现了一个出现过的非目标串,则输出-1,因为此时操作是一个环无法到达目标串AC代码:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051#include<stdio.h>#include<string.h>#include<algorithm>#include<map>#include<iostream>using namespace std;const int maxn=120;string s1,s2,s,s12;int main(){ int t,n,tt=1; cin>>t; while(tt<=t){ cin>>n; cin>>s1>>s2>>s; map<string,bool>vis; vis[s]=1; int cnt=0; while(1){ s12=\"\"; for(int i=0;i<n;i++){ s12+=s2[i]; s12+=s1[i]; } s12+=\"\\0\"; cnt++; if(s12==s){ cout<<tt<<\" \"<<cnt<<endl; break; } if(vis[s12]){ cout<<tt<<\" \"<<-1<<endl; break; } vis[s12]=1; s1=\"\"; s2=\"\"; for(int i=0;i<n;i++){ s1+=s12[i]; s2+=s12[i+n]; } s1+=\"\\0\"; s2+=\"\\0\"; } tt++; } return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"POJ","slug":"POJ","permalink":"https://anoyer.cn/tags/POJ/"},{"name":"模拟题","slug":"模拟题","permalink":"https://anoyer.cn/tags/模拟题/"}]},{"title":"POJ - 2251 - Dungeon Master(分层BFS)","slug":"POJ-2251-Dungeon-Master","date":"2019-02-25T09:14:37.000Z","updated":"2019-02-25T09:18:18.668Z","comments":true,"path":"article/POJ-2251-Dungeon-Master.html","link":"","permalink":"https://anoyer.cn/article/POJ-2251-Dungeon-Master.html","excerpt":"","text":"题目链接题意:给一个三维图,可以前后左右上下6种走法,走一步1分钟,求最少时间(其实就是最短路)题解:最短路Bfs,和二维的基本一样,就是原来4个方向,现在6个方向,原来数组是二维,现在是三维,也相当于模板题了。AC代码:12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364#include<stdio.h>#include<cstring>#include<queue>#include<algorithm>using namespace std;typedef long long ll;const int maxn=50;struct node{ int x,y,z; node(int xx=0,int yy=0,int zz=0){x=xx,y=yy,z=zz;};};char mp[maxn][maxn][maxn];int vis[maxn][maxn][maxn];int mov[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};int l,n,m;int sx,sy,sz,ex,ey,ez;bool check(node a){ if(a.z<l&&a.z>=0&&a.x<n&&a.x>=0&&a.y<m&&a.y>=0)return true; else return false;}int bfs(){ queue<node> dq; node now(sx,sy,sz),next; dq.push(now); vis[sz][sx][sy]=1; while(!dq.empty()){ now=dq.front(); dq.pop(); for(int i=0;i<6;i++){ next.z=now.z+mov[i][0]; next.x=now.x+mov[i][1]; next.y=now.y+mov[i][2]; if(check(next)&&vis[next.z][next.x][next.y]==0&&mp[next.z][next.x][next.y]!='#'){ dq.push(next); vis[next.z][next.x][next.y]=vis[now.z][now.x][now.y]+1; if(mp[next.z][next.x][next.y]=='E')return vis[next.z][next.x][next.y]; } } } return -1;}int main(){ while(scanf(\"%d%d%d\",&l,&n,&m)){ if(!n&&!m&&!l)break; getchar(); memset(mp,0,sizeof(mp)); memset(vis,0,sizeof(vis)); for(int i=0;i<l;i++){ for(int j=0;j<n;j++){ for(int k=0;k<m;k++){ scanf(\"%c\",&mp[i][j][k]); if(mp[i][j][k]=='S')sx=j,sy=k,sz=i; if(mp[i][j][k]=='E')ex=j,ey=k,ez=i; } getchar(); } getchar(); //吃换行 } int ans=bfs(); if(ans==-1)printf(\"Trapped!\\n\"); else printf(\"Escaped in %d minute(s).\\n\",ans-1); }}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"BFS","slug":"BFS","permalink":"https://anoyer.cn/tags/BFS/"},{"name":"POJ","slug":"POJ","permalink":"https://anoyer.cn/tags/POJ/"}]},{"title":"POJ - 1426 - Find The Multiple(双入口DFS)","slug":"POJ-1426-Find-The-Multiple","date":"2019-02-25T09:09:40.000Z","updated":"2019-02-25T09:14:03.440Z","comments":true,"path":"article/POJ-1426-Find-The-Multiple.html","link":"","permalink":"https://anoyer.cn/article/POJ-1426-Find-The-Multiple.html","excerpt":"","text":"题目链接题意:给一个数n,让你找出一个只有1,0,组成的十进制数,要求是找到的数可以被n整除题解:用DFS是搜索 当前位数字 (除最高位固定为1),因为每一位都只有0或1两种选择AC代码:123456789101112131415161718192021222324252627#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>using namespace std;typedef unsigned long long ll;const int maxn=230;int n;bool found;void dfs(ll ans,int k){ if(found)return; if(ans%n==0){ printf(\"%llu\\n\",ans); found=1; return; } if(k==19)return; dfs(ans*10,k+1); dfs(ans*10+1,k+1);}int main(){ while(scanf(\"%d\",&n)&&n){ found=0; dfs(1,0); } return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"BFS","slug":"BFS","permalink":"https://anoyer.cn/tags/BFS/"},{"name":"POJ","slug":"POJ","permalink":"https://anoyer.cn/tags/POJ/"}]},{"title":"POJ - 1321 - 棋盘问题(裸DFS)","slug":"POJ-1321","date":"2019-02-25T09:05:17.000Z","updated":"2019-02-25T09:09:16.835Z","comments":true,"path":"article/POJ-1321.html","link":"","permalink":"https://anoyer.cn/article/POJ-1321.html","excerpt":"","text":"题目链接题意:给你一个棋盘,问在这个棋盘上放K个棋子,有多少种放法(每行每列只能有一个棋子)题解:对棋盘DFS搜索,每满足一种就ans++,基本是裸的AC代码:123456789101112131415161718192021222324252627282930313233343536#include<stdio.h>#include<string.h>typedef long long ll;const int maxn=17;char mp[maxn][maxn];bool vis[maxn];ll ans=0;int k,n;void dfs(int x,int y){ if(y>=k){ ans++; return ; } for(int i=x;i<n;i++){ for(int j=0;j<n;j++){ if(vis[j]==0&&mp[i][j]=='#'){ vis[j]=1; dfs(i+1,y+1); vis[j]=0; } } } return;}int main(){ while(scanf(\"%d%d\",&n,&k)){ if(n==-1&&k==-1)break; memset(mp,0,sizeof(mp)); memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++)scanf(\"%s\",mp[i]); ans=0; dfs(0,0); printf(\"%lld\\n\",ans); } return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"DFS","slug":"DFS","permalink":"https://anoyer.cn/tags/DFS/"},{"name":"POJ","slug":"POJ","permalink":"https://anoyer.cn/tags/POJ/"}]},{"title":"HDU - 2612 - Find a way(BFS+打表)","slug":"HDU-2612-Find-a-way","date":"2019-02-25T09:00:10.000Z","updated":"2019-02-25T09:04:58.080Z","comments":true,"path":"article/HDU-2612-Find-a-way.html","link":"","permalink":"https://anoyer.cn/article/HDU-2612-Find-a-way.html","excerpt":"","text":"题目链接题意:求2个点到KFC的距离之和,使其最小题解:可用2次BFS,分别求出2个点到各个KFC的最短距离,然后找出和最小的即可AC代码:12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970#include<stdio.h>#include<string.h>#include<iostream>#include<queue>#define inf 0xffffffusing namespace std;const int N=210;int m,n,mark[N][N],dis[N][N][2],dir[4][2]={1,0, 0,1, -1,0, 0,-1},flag;char s[N][N];struct node{ int x,y,step;};bool judge(int x,int y){ if(x>=0 && x<m && y>=0 && y<n && s[x][y]!='#' && mark[x][y]==0) return 1; return 0;}void bfs(int x,int y){ int k; queue<node>q; node cur,next; cur.x=x;cur.y=y;cur.step=0; mark[x][y]=1; q.push(cur); while(!q.empty()){ cur=q.front(); q.pop(); next.step=cur.step+1; for(k=0;k<4;k++){ next.x=x=cur.x+dir[k][0]; next.y=y=cur.y+dir[k][1]; if(judge(x,y)){ mark[x][y]=1; if(s[x][y]=='@')dis[x][y][flag]=next.step; q.push(next); } } }}int main(){ int i,j,min; while(scanf("%d %d",&m,&n)!=-1){ min=inf; for(i=0;i<m;i++) for(j=0;j<n;j++) dis[i][j][0]=dis[i][j][1]=inf; for(i=0;i<m;i++)scanf("%s",s[i]); for(i=0;i<m;i++) for(j=0;j<n;j++){ if(s[i][j]=='Y'){ flag=0; memset(mark,0,sizeof(mark)); bfs(i,j); } else if(s[i][j]=='M'){ flag=1; memset(mark,0,sizeof(mark)); bfs(i,j); } } for(i=0;i<m;i++) for(j=0;j<n;j++) if(s[i][j]=='@' && min>dis[i][j][0]+dis[i][j][1]) min=dis[i][j][0]+dis[i][j][1]; printf("%d\\n",min*11); } return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"HDU","slug":"HDU","permalink":"https://anoyer.cn/tags/HDU/"},{"name":"BFS","slug":"BFS","permalink":"https://anoyer.cn/tags/BFS/"}]},{"title":"HDU - 1241 - Oil Deposits(DFS联通块)","slug":"HDU-1241-Oil-Deposits","date":"2019-02-25T08:53:51.000Z","updated":"2019-02-25T08:59:30.539Z","comments":true,"path":"article/HDU-1241-Oil-Deposits.html","link":"","permalink":"https://anoyer.cn/article/HDU-1241-Oil-Deposits.html","excerpt":"","text":"题目链接题意:就是给你一个地图,找出所有不相连(八个方向)的@组合有多少个题解:经典的DFS求联通块的题,和紫书上求油田一样,枚举每一个点进行DFS搜联通的@AC代码:12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849#include <stdio.h>#include<bits/stdc++.h>using namespace std;const int maxn=105;char mat[maxn][maxn];int dir[8][2]={{1,0},{-1,0},{0,1},{0,-1},{1,1},{-1,1},{1,-1},{-1,-1}};int m,n;int sum;void Dfs(int x,int y){ int tx; int ty; for(int i=0;i<8;i++){ tx=x+dir[i][0]; ty=y+dir[i][1]; if(1<=tx&&tx<=m&&1<=ty&&ty<=n){//注意!对于二维数组来说,x行y列,意味着x是纵向坐标,y是横向坐标 if(mat[tx][ty]=='@'){ mat[tx][ty]='*'; Dfs(tx,ty); } } }}int main(){ while(scanf(\"%d%d\",&m,&n)){ if(m==0&&n==0){ break; } //memset(mat,0,sizeof(mat)); sum=0; for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ //scanf(\"%s\",mat[i]+1); cin>>mat[i][j]; //scanf(\"%c\",&mat[i][j]); } } for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ if(mat[i][j]=='@'){ sum++; mat[i][j]='*'; Dfs(i,j); //深搜,消除同一连通块的所有油田标记 } } } cout<<sum<<endl; } return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"HDU","slug":"HDU","permalink":"https://anoyer.cn/tags/HDU/"},{"name":"DFS","slug":"DFS","permalink":"https://anoyer.cn/tags/DFS/"}]},{"title":"FZU - 2150 - Fire Game(双端BFS)","slug":"FZU-2150-Fire-Game","date":"2019-02-25T08:45:53.000Z","updated":"2019-02-25T09:49:22.535Z","comments":true,"path":"article/FZU-2150-Fire-Game.html","link":"","permalink":"https://anoyer.cn/article/FZU-2150-Fire-Game.html","excerpt":"","text":"题目链接题意:给你块地,有空地,也有草堆,让你选两个草堆进行点火,燃烧的草堆会引燃上下左右的相邻草堆,每一次引燃花费1s时间,问你最少花多长时间把草堆都点着,如果做不到输出-1.题解:枚举图中所有草地,找到任意两块不一样的草地,然后bfs求出烧掉所有草的最短时间,可以将两个初始状态都push进队列,这样就可以模拟两堆草同时燃烧的情况,在bfs的过程中要判断是否烧完(即所有的草堆的点都要被访问过),如果烧完,就立即返回这点的距离,就是以该状态枚举时,的最远距离,让后输出最远距离中最小的就是最终结果。AC代码:12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273#include<stdio.h>#include<string.h>#include<algorithm>#include<queue>#include<vector>using namespace std;typedef long long ll;const int maxn = 20;struct node{ int x, y; node(int i = 0, int j = 0){ x = i, y = j; };};char mp[maxn][maxn];int vis[maxn][maxn];int n, m;int _size;int dis[4][2] = { 1, 0, -1, 0, 0, 1, 0, -1 };vector<node>cp;int bfs(node a, node b){ memset(vis, 0, sizeof(vis)); queue<node>dq; dq.push(a); dq.push(b); vis[a.x][a.y] = vis[b.x][b.y] = 1; int ans = 1; //能达到的最大时间 node na, nb; while (!dq.empty()){ a = dq.front(), dq.pop(); for (int i = 0; i<4; i++){ na.x = a.x + dis[i][0]; na.y = a.y + dis[i][1]; if (na.x >= 0 && na.x<n&&na.y >= 0 && na.y<m&&mp[na.x][na.y] == '#'&&vis[na.x][na.y] == 0) dq.push(na), vis[na.x][na.y] = vis[a.x][a.y] + 1, ans = max(ans, vis[na.x][na.y]); } } for (int i = 0; i<_size; i++){ //遍历所有草堆看看是否全部都已经被火覆盖 if (vis[cp[i].x][cp[i].y] == 0)return -1; } return ans;}int main(){ int t, tt = 1; scanf(\"%d\", &t); node xx; while (tt <= t){ cp.clear(); scanf(\"%d%d\", &n, &m); for (int i = 0; i<n; i++){ getchar(); for (int j = 0; j<m; j++){ scanf(\"%c\", &mp[i][j]); xx.x=i,xx.y=j; if (mp[i][j] == '#')cp.push_back(xx); //存入#节点坐标,便于枚举火堆 } } int ans = 99999999; _size = cp.size(); if(_size==1)ans=1; //for(int i=0;i<_size;i++)cout<<cp[i].x<<\" \"<<cp[i].y<<endl; for (int i = 0; i<_size; i++){ for (int j = i + 1; j<_size; j++){ int tmp = bfs(cp[i], cp[j]); //枚举火堆跑bfs if(tmp==-1)continue; ans=min(tmp,ans); } } if(ans==99999999)printf(\"Case %d: -1\\n\", tt++); else printf(\"Case %d: %d\\n\", tt++, ans-1); } return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"BFS","slug":"BFS","permalink":"https://anoyer.cn/tags/BFS/"},{"name":"FZU","slug":"FZU","permalink":"https://anoyer.cn/tags/FZU/"}]},{"title":"2019 Wannafly Camp day8","slug":"2019-Wannafly-Camp-day8","date":"2019-01-27T11:04:56.000Z","updated":"2019-01-27T14:16:05.389Z","comments":true,"path":"article/2019-Wannafly-Camp-day8.html","link":"","permalink":"https://anoyer.cn/article/2019-Wannafly-Camp-day8.html","excerpt":"","text":"自闭感受Camp最后一天了,上午 hls 给我们讲了计数和概率,太无奈自己太菜只听懂了一点点,有点可惜了。ε=(´ο`*)))唉。下午训练果然和我预想的一样,最后一场应该是自闭场 (虽然天天自闭),一套题目下来,J题T了,A题队友被自己hack了,G题死怼一下午,从开始毫无思绪,到后面展开各种毛病。心态简直爆炸了不知不觉就过去了8天,突然对这段时光有点不舍,虽然自闭但却快乐着。晚上和队友回去,看着路上6人的影子 (包括另外一队),突然感觉ACM是多么一件快乐并有意义的事情!还有9个月时间,加油Anoyer!上题解G - 穗乃果的考试先对方块求一个二维前缀和,这样就相当于枚举前缀和中每一个小块的和了。123456789101112131415161718192021222324252627282930313233343536#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;const int mod=998244353;char s[2200][2200];ll a[2200][2200],sum[2200][2200];int main(){ int n,m; scanf(\"%d%d\",&n,&m); for(int i=0;i<n;i++)scanf(\"%s\",s[i]); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)a[i][j]=s[i-1][j-1]-'0'; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j]; ll ans=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)ans=(ans+sum[i][j]*(i*j))%mod; for(int i=0;i<=n;i++) for(int j=0;j<=m;j++)ans=(ans+sum[i][j]*(n-i)*(m-j))%mod; for(int i=1;i<=n;i++) for(int j=0;j<=m;j++)ans=(ans-sum[i][j]*i*(m-j))%mod; for(int i=0;i<=n;i++) for(int j=1;j<=m;j++)ans=(ans-sum[i][j]*((n-i)*j))%mod; while(ans<0)ans+=mod; printf(\"%lld\\n\",ans%mod); return 0;}","categories":[{"name":"2019 Wannafly Winter Camp","slug":"2019-Wannafly-Winter-Camp","permalink":"https://anoyer.cn/categories/2019-Wannafly-Winter-Camp/"}],"tags":[{"name":"Camp","slug":"Camp","permalink":"https://anoyer.cn/tags/Camp/"}]},{"title":"2019 Wannafly Camp day7","slug":"2019-Wannafly-Camp-day7","date":"2019-01-26T14:05:58.000Z","updated":"2019-01-27T02:51:25.045Z","comments":true,"path":"article/2019-Wannafly-Camp-day7.html","link":"","permalink":"https://anoyer.cn/article/2019-Wannafly-Camp-day7.html","excerpt":"","text":"自闭感受Camp第七天,上午xls给我们来了一波意识流图论讲解,我没有包图论所以听了些前面简单的,就去补day3,div1的数论了。经过群里一群大佬的点醒,发现自己傻逼了,明明可以直接用我div2的欧拉函数写法套上两个杜教加分块就能过,还整半天直接用莫比乌斯跑TT。下午训练赛,感觉题目有点坑,数据范围好大,就写了两道签到题EG,队友没有怼出A题,晚上听解题发现自己D题推的离答案就差一两步了,结果放弃了。难受!!!快被自己菜哭了。以后还是要多刷题啊,题量太少了,大佬们看啥都是原题,加油。上题解E - 线性探查法按照哈希的操作进行逆操作,求出每一位最小数值,利用set维护压入的最小值。123456789101112131415161718192021222324252627282930313233343536373839#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=3e3+20;struct Node{ ll a; int id; bool operator < (const Node &oth) const{ return a < oth.a; }};ll b[maxn];int main(){ int n; set<Node>st; scanf(\"%d\",&n); for(int i=0;i<n;i++){ scanf(\"%lld\",&b[i]); if(b[i]%n==i)st.insert({ b[i] , i }); } for(int i=1;i<n;i++){ //逆操作求解 Node f=*st.begin(); st.erase(st.begin()); b[f.id]=0; //已经插入 printf(\"%lld \",f.a); int j=f.id; while(!b[j])j=(j+1)%n; //找出应该放入的位置 int k=b[j]%n,flag=1; //实际位置 while(k!=j){ if(b[k]){ flag=0; } k=(k+1)%n; } if(flag)st.insert({b[j],j}); } cout<<st.begin()->a<<endl;}G - 抢红包机器人枚举每个红包的第一个抢的人为机器人,去暴力正反扫两遍红包序列,找出机器人,最后取枚举得到的数的min,最后看看是否有人未参与抢红包,有的话就直接输出1。(可以更优,直接枚举人)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354#include<stdio.h>#include<bits/stdc++.h>using namespace std;int a[120][120];bool b[120],mp[120];int nn[120];int main(){ int n,m; cin>>n>>m; for(int i=0;i<m;i++){ int aa; scanf(\"%d\",&nn[i]); for(int j=0;j<nn[i];j++){ scanf(\"%d\",&a[i][j]); b[a[i][j]]=1; //标记此人参与了抢红包 } } int cnt1=0; for(int i=1;i<=n;i++){ if(b[i]==0)cnt1++; } if(cnt1)printf(\"1\\n\"); else { int res=0,ans=999999; for(int i=0;i<m;i++){ memset(mp,0,sizeof(mp)); mp[a[i][0]]=1; res=0; for(int j=0;j<m;j++){ //正扫 for(int k=nn[j]-1;k>=0;k--){ if(mp[a[j][k]]){ for(k--;k>=0;k--){ mp[a[j][k]]=1; } } } } for(int j=m-1;j>=0;j--){ //反扫 for(int k=nn[j]-1;k>=0;k--){ if(mp[a[j][k]]){ for(k--;k>=0;k--){ mp[a[j][k]]=1; } } } } for(int i=1;i<=n;i++)if(mp[i])res++; ans=min(ans,res); } printf(\"%d\\n\",ans); } return 0;}","categories":[{"name":"2019 Wannafly Winter Camp","slug":"2019-Wannafly-Winter-Camp","permalink":"https://anoyer.cn/categories/2019-Wannafly-Winter-Camp/"}],"tags":[{"name":"Camp","slug":"Camp","permalink":"https://anoyer.cn/tags/Camp/"}]},{"title":"2019 Wannafly Camp day5","slug":"2019-Wannafly-Camp-day5","date":"2019-01-24T13:24:37.000Z","updated":"2019-01-26T03:07:52.680Z","comments":true,"path":"article/2019-Wannafly-Camp-day5.html","link":"","permalink":"https://anoyer.cn/article/2019-Wannafly-Camp-day5.html","excerpt":"","text":"自闭感受参加Camp第五天,今天是dls的计算几何专场,可是说是几何板子讲解,也是这几天听得最明白,学得最多的一天。dls从基础的点积叉积到线到圆等,感觉非常Nice,相对dls说。下午依旧是训练赛,比昨天感觉好不少,真的是越来越亲民了,还以为今天要爆零自闭呢。同时经过今天的计算几何,感觉自己整理一套计算几何板子真的非常有必要,结束后也该操手了。上题解A - Cactus Draw把节点的深度做x坐标,儿子序做y坐标,进行DFS遍历,因为是棵树所以肯定不会交边123456789101112131415161718192021222324252627282930313233343536373839#include<stdio.h>#include<bits/stdc++.h>using namespace std;const int maxn=1e4+10;struct edge{ int v,next;}e[maxn];int head[maxn],hcnt=0;int u[maxn],v[maxn];void add(int u,int v){ e[hcnt]=edge{v,head[u]}; head[u]=hcnt++;}pair<int,int> point[maxn];bool vi[maxn];int vis[maxn];void dfs(int u,int x){ if(vi[u])return; vi[u]=1; if(!vis[x]) vis[x]=1; point[u]=make_pair(x,vis[x]++); for(int i=head[u];i>=0;i=e[i].next){ int v=e[i].v; if(vi[v])continue; dfs(v,x+1); }}int main(){ int n,m; scanf("%d%d",&n,&m); memset(head,-1,sizeof(head)); for(int i=1;i<=m;i++) scanf("%d%d",&u[i],&v[i]),add(u[i],v[i]),add(v[i],u[i]); dfs(1,1); for(int i=1;i<=n;i++) cout<<point[i].first<<' '<<point[i].second<<endl; return 0;}C - Division把每个数先压到优先队列中,每次操作取队顶元素除2再压进去,同时判断下队顶是否为0,如果为0就没必要继续操作了。因为数大小1e9所以每个数最多就操作30次。123456789101112131415161718192021222324252627282930#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e5+7;priority_queue<int>a;int main(){ int n,k,aa; scanf(\"%d%d\",&n,&k); for(int i=0;i<n;i++){ scanf(\"%d\",&aa); a.push(aa); } ll ans=0; for(int i=0;i<k;i++){ aa=a.top(); a.pop(); if(aa==0){ break; } a.push(aa/2); } while(!a.empty()){ if(a.top()==0)break; ans+=a.top(); a.pop(); } printf(\"%lld\\n\",ans); return 0;}I - Sorting将小于等于X的数当做0,大于x的数当做1,因为交换后相对顺序不会变,就可以预处理出各自的前缀和,根据处于的位置计算值。用线段树来维护区间内01的个数,Ok啦123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133#include<bits/stdc++.h>using namespace std;const int maxn=2e5+10;#define ls rt<<1#define rs rt<<1|1int a[maxn],b[maxn];long long int r0[maxn],r1[maxn];int cnt1=1,cnt0=1;struct tree{ int l,r; int x; int sum; int lazy;}t[maxn*4];void pushdown(int rt){ if(t[rt].lazy==1){ t[ls].sum=t[ls].r-t[ls].l+1; t[rs].sum=t[rs].r-t[rs].l+1; t[ls].lazy=1; t[rs].lazy=1; } else if(t[rt].lazy==-1){ t[ls].sum=0; t[rs].sum=0; t[ls].lazy=-1; t[rs].lazy=-1; } t[rt].lazy=0;}void build(int rt,int l,int r){ t[rt].l=l; t[rt].r=r; t[rt].x=0; t[rt].sum=0; t[rt].lazy=0; if(t[rt].l==t[rt].r){ return ; } int mid=l+r>>1; build(ls,l,mid); build(rs,mid+1,r);}void dadd(int rt,int x){ if(t[rt].l==x && t[rt].r==x){ t[rt].x=1; t[rt].sum++; return; } int mid=t[rt].l+t[rt].r>>1; if(mid<x) dadd(rs,x); else dadd(ls,x); t[rt].sum=t[ls].sum+t[rs].sum;}void change(int rt,int ql,int qr,int l,int r,int x,int type){ if(ql>=l && qr<=r){ if(x==0){ t[rt].sum=0; t[rt].lazy=-1; } else{ t[rt].sum=qr-ql+1; t[rt].lazy=1; } return ; } pushdown(rt); int mid=ql+qr>>1; if(l<=mid) change(ls,ql,mid,l,r,x,type); if(r>mid) change(rs,mid+1,qr,l,r,x,type); t[rt].sum=t[ls].sum+t[rs].sum;}int query(int rt,int ql,int qr,int l,int r){ if(l>r)return 0; if(ql>=l && qr<=r){ return t[rt].sum; } pushdown(rt); int mid=ql+qr>>1; int sum=0; if(l<=mid) sum+= query(ls,ql,mid,l,r); if(r>mid) sum+=query(rs,mid+1,qr,l,r); return sum;}int main(){ int n,q,x; cin>>n>>q>>x; build(1,1,n); for(int i=1;i<=n;i++){ cin>>a[i]; if(a[i]<=x)r0[cnt0]=r0[cnt0++-1]+a[i]; else dadd(1,i),r1[cnt1]=r1[cnt1++-1]+a[i]; } int o,L,R; for(int i=1;i<=q;i++){ cin>>o>>L>>R; if(o==1){ int k=query(1,1,n,L,R);//区间内有k个1 int k1=query(1,1,n,1,L-1);//前面有k1个1 int S=R-L+1; int k0=S-k; int k00=L-1-k1; long long int sum1=r1[k1+k]-r1[k1]; long long int sum0=r0[ S-k + L-1-k1 ]-r0[L-1-k1]; cout<<sum1 + sum0<<endl; } else if(o==2){ int k=query(1,1,n,L,R);//区间内有k个1 int k1=R-L+1-k;//k1个0 change(1,1,n,L,L+k1-1,0,0); change(1,1,n,L+k1,R,1,1); } else if(o==3){ int k=query(1,1,n,L,R);//区间内有k个1 int k1=R-L+1-k;//k1个0 change(1,1,n,L,L+k-1,1,1); change(1,1,n,L+k,R,0,0); } } return 0;}J - Special Judge对任意两条边都进行判断是否相交,如果相交则在判断是否是相交于端点,不过不是则ans++。是的话在判断下是不是重合边,如果不是重合边就不符合,是就ans++.1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;struct node{ double x; double y;};bool judge(node a,node b,node c,node d){ if(min(a.x,b.x) <= max(c.x,d.x) && min(c.x,d.x) <= max(a.x,b.x) && min(a.y,b.y) <= max(c.y,d.y) &&min(c.y,d.y)<=max(a.y,b.y)) { double u,v,w,z;//保存叉乘 u=(c.x-a.x)*(b.y-a.y)-(b.x-a.x)*(c.y-a.y); v=(d.x-a.x)*(b.y-a.y)-(b.x-a.x)*(d.y-a.y); w=(a.x-c.x)*(d.y-c.y)-(d.x-c.x)*(a.y-c.y); z=(b.x-c.x)*(d.y-c.y)-(d.x-c.x)*(b.y-c.y); return (u*v<=0.00000001 && w*z<=0.00000001); //浮点数判断大小 } return false;}bool onsegment(node pi,node pj,node Q){ if((Q.x-pi.x)*(pj.y-pi.y)==(pj.x-pi.x)*(Q.y-pi.y)&&min(pi.x,pj.x)<=Q.x&&Q.x<=max(pi.x,pj.x)&&min(pi.y,pj.y)<=Q.y&&Q.y<=max(pi.y,pj.y)){ return true; }else{ return false; }}bool check(node a,node b,node c,node d){ double len=(a.x-b.x)*(c.y-d.y)-(c.x-d.x)*(a.y-b.y); if(len==0)return 1; else return 0;}const int maxn=1020;struct Node{ int a,b;}mp[2*maxn];node p[maxn];int main(){ int n,m; int ans=0; scanf(\"%d%d\",&n,&m); for(int i=1;i<=m;i++){ scanf(\"%d%d\",&mp[i].a,&mp[i].b); } for(int i=1;i<=n;i++)scanf(\"%lf%lf\",&p[i].x,&p[i].y); for(int i=1;i<=m;i++){ for(int j=i+1;j<=m;j++){ if(judge(p[mp[i].a],p[mp[i].b],p[mp[j].a],p[mp[j].b])){ if(mp[i].a==mp[j].a||mp[i].a==mp[j].b||mp[i].b==mp[j].a||mp[i].b==mp[j].b){ //判断是否是交于端点 if(check(p[mp[i].a],p[mp[i].b],p[mp[j].a],p[mp[j].b])){ //看两边是否平行 //如果平行,通过判断一边的两端点是否在另外一边上 if((onsegment(p[mp[j].a],p[mp[j].b],p[mp[i].a])&&onsegment(p[mp[j].a],p[mp[j].b],p[mp[i].b]))||(onsegment(p[mp[i].a],p[mp[i].b],p[mp[j].a])&&onsegment(p[mp[i].a],p[mp[i].b],p[mp[j].b]))) ans++; } } else ans++; } } } printf(\"%d\\n\",ans); return 0;}","categories":[{"name":"2019 Wannafly Winter Camp","slug":"2019-Wannafly-Winter-Camp","permalink":"https://anoyer.cn/categories/2019-Wannafly-Winter-Camp/"}],"tags":[{"name":"Camp","slug":"Camp","permalink":"https://anoyer.cn/tags/Camp/"}]},{"title":"2019 Wannafly Camp day4","slug":"2019-Wannafly-Camp-day4","date":"2019-01-23T14:12:24.000Z","updated":"2019-01-27T14:30:44.530Z","comments":true,"path":"article/2019-Wannafly-Camp-day4.html","link":"","permalink":"https://anoyer.cn/article/2019-Wannafly-Camp-day4.html","excerpt":"","text":"自闭感受Camp第四天,非常傻逼并快乐的一天 。上午Claris给我们讲DP,而且从基础开始讲,虽然没有包DP,但是还是学到了不少,非常棒。中午所有人在科技楼下面来了一张大合影 (寒风中瑟瑟发抖) ,最最最最happy的是找各位巨巨们要到了签名,(可惜没要到唐老师的 )下午训练是目前几场最签到的场了,但是不知为啥周围加我队3队人都傻逼了,明明非常简单片面的东西看的非常复杂,真的是…不想说了,最后吸取教训不管题目怎么样,都有保持一颗平常心态和清醒的头脑。上题解A - 夺宝奇兵很简单的一道题,相邻两组宝藏走法只有两种交叉走,或者平行走(就是一号第一个宝藏走到二号第二个或者一号第一个走到二号第一个),所以for扫一遍去min就可以了12345678910111213141516171819#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e5+7;int a[maxn],b[maxn];ll dis(int i,int j){ return abs(a[i]-a[j])+abs(b[i]-b[j]);}int main(){ int n,m; scanf(\"%d%d\",&n,&m); for(int i=0;i<2*n;i++)scanf(\"%d%d\",&a[i],&b[i]); ll ans=dis(2*n-1,2*n-2); for(int i=2;i<2*n;i+=2){ ans+=min(dis(i,i-2)+dis(i+1,i-1),dis(i,i-1)+dis(i+1,i-2)); } printf(\"%lld\\n\",ans);}C - 最小边覆盖最小边覆盖,不能有多余的边重复覆盖点。所以如果发现一个点被多余的覆盖了就不是最小点覆盖12345678910111213141516171819202122#include<stdio.h>#include<bits/stdc++.h>using namespace std;const int maxn=2e5+10;int in[maxn],u[maxn],v[maxn];int main(){ int n,m; scanf(\"%d%d\",&n,&m); for(int i=1;i<=m;i++){ scanf(\"%d%d\",&u[i],&v[i]); in[u[i]]++; in[v[i]]++; } for(int i=1;i<=m;i++){ if(in[u[i]]>1 && in[v[i]]>1){ printf(\"No\\n\"); exit(0); } } printf(\"Yes\\n\"); return 0;}F - 小小马因为走法比较特殊,如果当前xy奇偶性相同,下一步则必定不同,所以黑白格子是轮流出现的,这样就可以根据起点和终点的奇偶性判断是否黑格数等于白格数了。同时可以发现只有棋盘大于3 4可以从一个点到达棋盘任何点, 3 3的棋盘除去中心点其余点都能相互走到,其他棋盘情况就看看从起点和终点xy的关系,如果a%2==0&&(a/2)%2==1&&b==1则可以走。12345678910111213141516171819202122#include<stdio.h>#include<bits/stdc++.h>using namespace std;int main(){ int n,m,sx,sy,ex,ey; cin>>n>>m>>sx>>sy>>ex>>ey; if(n>=3&&m>=3){ if((n==3&&m==3)&&(sx==2&&sy==2)||(ex==2&&sy==2)){ printf(\"No\\n\"); return 0; } if((sx%2+sy%2)%2==(ex%2+ey%2)%2)printf(\"No\\n\"); else printf(\"Yes\\n\"); } else{ int a=max(abs(sy-ey),abs(sx-ex)),b=min(abs(sy-ey),abs(sx-ex)); if(a%2==0&&(a/2)%2==1&&b==1) printf(\"Yes\\n\"); else printf(\"No\\n\"); }}G - 置置置换定义dp[i][j]为 i个数的排列中,最后一个数字为j当i为偶数的时候,位于山谷,需要前面大于他dp[i][j]+=dp[i-1][k], j<=k<=i-1之所以可以这么写是因为,前面并没有出现i这个数字,所以也没有计算dp[i-1][i],但是有个巧妙的做法假设把前面所有大于等于j的数+1,就刚好解决这个问题了。当i为奇数的时候,位于山峰,需要前面小于他dp[i][j]+=dp[i-1][k], 1<=k<=j-1;这个很显然直接写是n^3,可以使用前缀和优化1234567891011121314151617181920212223#include<bits/stdc++.h>using namespace std;const int maxn=2e5+10;const int MOD=1e9+7;typedef long long ll;ll dp[1010][1010];int sum[maxn];int main(){ int n; scanf(\"%d\",&n); dp[1][1]=1; for(int i=2;i<=n;i++){ for(int j=1;j<=i;j++){ if(i&1)//奇数,升序 从1->(j-1)转移 dp[i][j]=(dp[i][j-1]+dp[i-1][j-1]+MOD)%MOD;//前缀和优化 else{//偶数,降序 从j -> i转移 dp[i][j]=(dp[i][j-1]+dp[i-1][i-1]-dp[i-1][j-1]+MOD)%MOD; } } } printf(\"%lld\\n\",dp[n][n]); return 0;}I - 咆咆咆哮基本思路就是贪心枚举选a的数量num,去选择num个对ans贡献最大a,然后ans取min。123456789101112131415161718192021222324252627282930#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e3+7;struct Node{ int a,b;}a[maxn];int num;bool cmp(Node a,Node b){ return a.a-num*a.b>b.a-num*b.b;}int main(){ int n; scanf(\"%d\",&n); for(int i=0;i<n;i++){ scanf(\"%d%d\",&a[i].a,&a[i].b); } ll ans=0,anss=0; for(num=1;num<=n;num++){ sort(a,a+n,cmp); anss=0; for(int i=0;i<num;i++)anss+=a[i].a; for(int i=num;i<n;i++)anss+=num*a[i].b; ans=max(ans,anss); } printf(\"%lld\\n\",ans); return 0;}","categories":[{"name":"2019 Wannafly Winter Camp","slug":"2019-Wannafly-Winter-Camp","permalink":"https://anoyer.cn/categories/2019-Wannafly-Winter-Camp/"}],"tags":[{"name":"Camp","slug":"Camp","permalink":"https://anoyer.cn/tags/Camp/"}]},{"title":"2019 Wannafly Camp day3","slug":"2019-Wannafly-Camp-day3","date":"2019-01-22T08:46:05.000Z","updated":"2019-01-26T03:08:03.583Z","comments":true,"path":"article/2019-Wannafly-Camp-day3.html","link":"","permalink":"https://anoyer.cn/article/2019-Wannafly-Camp-day3.html","excerpt":"","text":"自闭感受参加Camp的第三天,上午是数据结构专题分享,dls 不打CF,分数可能比我们都低的2300分只打过三场的巨巨队友 wls来给我们讲的 。比起昨天的数论专场,今天感觉好多了,懵逼少很多还能跟上节奏。wls是带着题目来给我们讲常见的数据结构运用,比如堆,并查集,线段树,平衡树等等。下午原本以为是数据结构专题训练,便戏耍的和lyy说下午你专场我回去了哈 。结果下午题目比day1,day2还难,而且不是想象中的数据结构专题。一开始我便瞄到了F题,好眼熟!!!这不是莫比乌斯反演吗?就开始怼了。lyy开了D,结果这 SB不会写,我先放了下F题,看了下G题发现G题是个签到题 (上面写的) 。我就叫他看G,然后我切回了我的F。一波推式子,发现思路可行就巴拉巴拉敲了起来,中间因为炸int问题wa了几发,SB了!队友G题比我先过了,确实是个签到题 。最后有个乌龙,4点多的样子,队友和旁队的一起随机猜吧A题(因为只有2组数据,一共就1024种情况),竟然A了,然后大喊了一声答案,果断一波A的AC流。不知道出题人看到会心咋想感受:非常难得场上A出一道正儿八经的数论反演题,开森,同时发现队伍配合实在差,必须好好抓抓,不然要GG,尤其新人。上题解(后期补题会更新其他能力范围内的题解)F - 小清新数论做法一:欧拉函数12345678910111213141516171819202122232425262728293031323334#include<stdio.h>#include<bits/stdc++.h>using namespace std;#define LL long longconst int maxn = 1e7+9;const LL mod = 998244353;LL phi[maxn],miu[maxn],fac[maxn];//phi--欧拉函数表 miu--莫比乌斯函数表 fac--i最大的素因子辅助打phi表void init(){ for (int i = 1; i < maxn; ++i) fac[i] = i; phi[1] = miu[1] = 1; for (int i = 2; i < maxn; ++i) { if (fac[i] == i) for (int j = i << 1; j < maxn; j += i) fac[j] = i; if (i / fac[i] % fac[i]) phi[i] = (fac[i] - 1)*phi[i / fac[i]], miu[i] = -miu[i / fac[i]]; //如果b质数 a%b!=0 phi(a*b) = phi(a)*b - phi(a) else phi[i] = fac[i] * phi[i / fac[i]], miu[i] = 0; //当b是质数,a%b==0,phi(a*b)=phi(a)*b } for(int i=1;i<maxn;i++)phi[i]=phi[i]+phi[i-1];}int main(){ init(); LL n; cin>>n; LL NN=n; LL ans=0; for(LL i=1;i<=NN;i++){ LL res=(phi[NN/i]*(LL)2-1)%mod; ans=(ans+miu[i]*res%mod)%mod; while(ans<0)ans+=mod; } printf(\"%lld\\n\",ans);}做法二:莫比乌斯反演12345678910111213141516171819202122232425262728293031323334353637383940414243#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;const int mod=998244353;const int maxn=1e7+1;ll phi[maxn],miu[maxn],vis[maxn];void init(){ for(int i=1;i<maxn;++i)vis[i]=i; phi[1]=miu[1]=1; for(int i=2;i<maxn;i++){ if(vis[i]==i){ for(int j=i<<1;j<maxn;j+=i)vis[j]=i; } if(i/vis[i]%vis[i])miu[i]= -miu[i/vis[i]]; else miu[i]=0; } for(int i=1;i<maxn;i++)miu[i]=miu[i]+miu[i-1];}ll solve(int n,int m){ ll ans=0; int N=min(n,m),r; for(int l =1;l<=N;l=r+1){ r=min(n/(n/l),m/(m/l)); //取分块小的数 ll res=(miu[r]-miu[l-1]+mod)%mod*(n/l)%mod*(n/l)%mod; //miu[r]-miu[l-1]表示l~r区间miu和, ans=(ans+res+mod)%mod; } return ans;}int main(){ init(); int n,r; scanf(\"%d\",&n); ll ans=0,res; for(int l=1;l<=n;l=r+1){ r=n/(n/l); res=(miu[r]-miu[l-1]+mod)%mod*solve(n/l,n/l)%mod; ans=(ans+res+mod)%mod; } printf(\"%lld\\n\",ans); return 0;}做法三:杜教筛能过div1,跑了1423ms,对做法一中欧拉函数前n项和,欧拉函数前n项和进行杜教筛,然后套一个分块求解123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475#include<stdio.h>#include<bits/stdc++.h>#include<tr1/unordered_map>#define INV2 499122177using namespace std;typedef long long ll;const int N=1e7+20;const int mod=998244353;bool vis[N];int mu[N],sum1[N];long long phi[N],sum2[N];int cnt,prim[N];int e,e1;tr1::unordered_map<long long,long long>w,w1; //哈希 w用来求phi前缀和 w1用来求miu前缀和void get(int maxn){ phi[1]=mu[1]=1; for(int i=2;i<=maxn;i++) { if(!vis[i]) { prim[++cnt]=i; mu[i]=-1;phi[i]=i-1; } for(int j=1;j<=cnt&&prim[j]*i<=maxn;j++) { vis[i*prim[j]]=1; if(i%prim[j]==0) { phi[i*prim[j]]=phi[i]*prim[j]; break; } else mu[i*prim[j]]=-mu[i],phi[i*prim[j]]=phi[i]*(prim[j]-1); } } for(int i=1;i<=maxn;i++)sum1[i]=sum1[i-1]+mu[i],sum2[i]=(sum2[i-1]+phi[i])%mod; //打一个maxn的phi前缀和表 和miu前缀和表}int djsmu(long long x) // 求miu前缀和{ if(x<=10000000)return sum1[x]; if(w[x])return w[x]; int ans=1; for(long long l=2,r;l<=x;l=r+1) { r=x/(x/l); ans-=(r-l+1ll)*djsmu(x/l); } return w[x]=ans;}long long djsphi(long long x) //求phi 前缀和{ if(x<=10000000)return sum2[x]; if(w1[x])return w1[x]; long long ans=x%mod*(x+1)%mod*INV2%mod; for(long long l=2,r;l<=x;l=r+1) { r=x/(x/l); ans=(ans-(r-l+1)%mod*djsphi(x/l)+mod)%mod; } while(ans<0)ans+=mod; return w1[x]=ans%mod;}int main(){ get(10000000); ll n,r; scanf("%lld",&n); ll ans=0,res; for(ll l=1;l<=n;l=r+1){ r=n/(n/l); res=(ll)(djsmu(r)-djsmu(l-1)+mod)%mod*((djsphi(n/l)%mod*(ll)2%mod-1+mod)%mod)%mod; ans=(ans+res+mod)%mod; } printf("%lld\\n",ans); return 0;}G - 排列**搞清楚每个数组都是干什么的。P 原数组Ap 前缀数组q Ap中第i大的位置(相同的先取左边,例如 AP={2,1, 1},第1小的位置是2而不是3.)现在题目给了q,可以根据q倒推出Ap,然后倒推出P12345678910111213141516171819202122232425262728293031include<stdio.h>#include<bits/stdc++.h>using namespace std;const int maxn =1e5+10;int a[maxn];int q[maxn];int main(){ int n; scanf(\"%d\",&n); int cnt=0; int pre=maxn+10; for(int i=1;i<=n;i++){ scanf(\"%d\",&a[i]); if(a[i]>pre) q[a[i]]=cnt; else q[a[i]]=++cnt; pre=a[i]; } cnt=q[1]; printf(\"%d \",cnt); for(int i=2;i<=n;i++){ if(q[i]<q[i-1]) printf(\"%d \",q[i]); else{ printf(\"%d \",++cnt); } } return 0;}","categories":[{"name":"2019 Wannafly Winter Camp","slug":"2019-Wannafly-Winter-Camp","permalink":"https://anoyer.cn/categories/2019-Wannafly-Winter-Camp/"}],"tags":[{"name":"Camp","slug":"Camp","permalink":"https://anoyer.cn/tags/Camp/"}]},{"title":"2019 Wannafly Camp day2","slug":"2019-Wannafly-Camp-day2","date":"2019-01-21T14:23:52.000Z","updated":"2019-01-26T03:07:40.209Z","comments":true,"path":"article/2019-Wannafly-Camp-day2.html","link":"","permalink":"https://anoyer.cn/article/2019-Wannafly-Camp-day2.html","excerpt":"","text":"自闭感受今天上午吉老师吉老师给我们讲了一通数论知识,可以说是醍醐灌顶吧,半懂半懵(简单的懂了,难的n^n脸懵逼),真的是菜的教不来啊 不过吉老师不亏是WF金牌爷,属实强大啊。下午数论自闭专场(好像大部分数论题都没几个做出来的 ),自闭场了就写出2道题AH,有点难受,K题队友T了,B吃饭时候想出了正确的贪心策略。开始我先开的A题,队友lyy和hxx开了K题,同时写崩,A题写半天发现怼的是div1的B题,K题lyy先T。后来A题瞎几把想了个假的贪心,贪最大值,果断wa了3发,发现是个假策略并算了算复杂度发现直接n方暴力。然后hxx的k也T了,对拍了波两人代码,发现没错误,那就凉了假算法。此时lyy便切到了B题,我开了H题,发现是个求球交体积的题目,取横截面积进行微积分(我有板子自己裸板子过的),在这题还闹了个乌龙,样例完全正确后,我交了H并和队友说了句过了,队友说小心WA,秒回了“样例过了就是过了”,结果CE ,有个结构体函数忘了函数类型,改改就A了。H过后便和lyy开始怼B题,因为K题实在不会了,目测是状压DP不会写。B题HACK了好几个YY出来的的假贪心策略之后,就直接去吃饭了,吃饭时候想到了贪长度,可惜已经GG了。今天虽然是数论专场,但是感觉打脸最多的就是自己的假贪心策略,以后想出的策略觉得要证明正确性再写,一定不要莽上题解(后期补题会更新其他能力范围内的题解)A-Erase Numbers II123456789101112131415161718192021222324252627282930313233#include<stdio.h>#include<bits/stdc++.h>#define ull unsigned long longusing namespace std;const int maxn = 6e3 + 10;ull a[maxn];void slove(ull &a, ull b){ while(b){ a *= 10; b /= 10; }}int main(){ int t, t1 = 1; scanf(\"%d\", &t); while(t--){ int n; scanf(\"%d\", &n); for(int i = 0; i < n; ++i) cin >> a[i]; ull ans = 0, temp; for(int i = 0; i < n - 1; ++i){ for(int j = i + 1; j < n; ++j){ temp = a[i]; slove(temp, a[j]); ans = max(ans, temp + a[j]); } } cout << \"Case #\" << t1++ << \": \" << ans << endl; } return 0;}H-Cosmic Cleaner123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104#include<stdio.h>#include<bits/stdc++.h>using namespace std;const double PI = acos(-1.0);typedef long long ll;const int maxn=120;struct point { double x,y,z; point() {} void Init(double a, double b,double c){ x = a; y = b; z = c; } point(double a, double b,double c){ x = a; y = b; z = c; } point operator -(const point &b)const { //返回减去后的新点 return point(x - b.x, y - b.y,z-b.z); } point operator +(const point &b)const { //返回加上后的新点 return point(x + b.x, y + b.y,z+b.z); } //数乘计算 point operator *(const double &k)const { //返回相乘后的新点 return point(x * k, y * k,z*k); } point operator /(const double &k)const { //返回相除后的新点 return point(x / k, y / k,z/k); } double operator *(const point &b)const { //点乘 return x*b.x + y*b.y+z*b.z; }};double dist(point p1, point p2) { //返回平面上两点距离 return sqrt((p1 - p2)*(p1 - p2));}struct sphere {//球 double r; point centre;};void SphereInterVS(sphere a, sphere b,double &v) { double d = dist(a.centre, b.centre);//球心距 if(d>=a.r+b.r)return; if(a.r-d>=b.r){ v+=PI*4.0/3.0*b.r*b.r*b.r; return; } if(a.r<=b.r-d){ v+=PI*4.0/3.0*a.r*a.r*a.r; return; } double t = (d*d + a.r*a.r - b.r*b.r) / (2.0 * d);// double h = sqrt((a.r*a.r) - (t*t)) * 2;//h1=h2,球冠的高 double angle_a = 2 * acos((a.r*a.r + d*d - b.r*b.r) / (2.0 * a.r*d)); //余弦公式计算r1对应圆心角,弧度 double angle_b = 2 * acos((b.r*b.r + d*d - a.r*a.r) / (2.0 * b.r*d)); //余弦公式计算r2对应圆心角,弧度 double l1 = ((a.r*a.r - b.r*b.r) / d + d) / 2; double l2 = d - l1; double x1 = a.r - l1, x2 = b.r - l2;//分别为两个球缺的高度 double v1 = PI*x1*x1*(a.r - x1 / 3);//相交部分r1圆所对应的球缺部分体积 double v2 = PI*x2*x2*(b.r - x2 / 3);//相交部分r2圆所对应的球缺部分体积 v += v1 + v2;//相交部分体积}struct Node{ double x,y,z,r;}a[maxn];double x,y,z,r;int n;double Solve(){ double v=0; sphere A,B; A.r=r; A.centre.Init(x,y,z); for(int i=0;i<n;i++){ B.r=a[i].r; B.centre.Init(a[i].x,a[i].y,a[i].z); SphereInterVS(A,B,v); } return v;}int main(){ int t,tt=1; /*sphere A,B; A.r=1; A.centre.Init(0,0,0); B.r=1; B.centre.Init(0,0,0); double v=0; SphereInterVS(A,B,v); printf(\"%lf\",v);*/ scanf(\"%d\",&t); while(tt<=t){ scanf(\"%d\",&n); for(int i=0;i<n;i++){ scanf(\"%lf%lf%lf%lf\",&a[i].x,&a[i].y,&a[i].z,&a[i].r); } scanf(\"%lf%lf%lf%lf\",&x,&y,&z,&r); printf(\"Case #%d: %.10lf\\n\",tt++,Solve()); } return 0;}","categories":[{"name":"2019 Wannafly Winter Camp","slug":"2019-Wannafly-Winter-Camp","permalink":"https://anoyer.cn/categories/2019-Wannafly-Winter-Camp/"}],"tags":[{"name":"Camp","slug":"Camp","permalink":"https://anoyer.cn/tags/Camp/"}]},{"title":"2019 Wannafly Camp Day1","slug":"2019-Wannafly-Camp-day1","date":"2019-01-20T14:19:23.000Z","updated":"2019-01-27T11:03:59.008Z","comments":true,"path":"article/2019-Wannafly-Camp-day1.html","link":"","permalink":"https://anoyer.cn/article/2019-Wannafly-Camp-day1.html","excerpt":"","text":"自闭感受第一次参加这种线下的算法Camp,不得不说和队友都是内心非常的小鸡动。上午开幕式wls讲了一堆话,差不多就是一起呲逼加鸡汤吧(哈哈希望wls不要打死我)。下午就是day训练赛了,因为一个主力队友生病没来,带着一个新队友2排,直接跳过了图论和DP题,差点就死怼C构造和E暴零自闭了,最后发现J题原题一发A,最后C题放弃了构造去写了100*100的暴力过了(抹汗)。自己还是太菜了,还有好多成长空间,细节,第一解题反应,耐心等等。不多说上题解(后期补题会更新其他能力范围内的题解)B-吃豆豆思路:3维DP维护一个3维数组,表示(i,j)位置第K秒有多少糖果,通过k-1秒5个位置转移得到(i,j,k)123456789101112131415161718192021222324#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=10010;int dp[20][20][maxn];int mp[20][20];int main(){ int n,m,c,xs,ys,xt,yt; scanf(\"%d%d%d\",&n,&m,&c); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)scanf(\"%d\",&mp[i][j]); scanf(\"%d%d%d%d\",&xs,&ys,&xt,&yt); memset(dp,-0x3f,sizeof(dp)); dp[xs][ys][0]=0; for(int k=1;k<maxn;k++) for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ dp[i][j][k]=max({dp[i-1][j][k-1],dp[i][j+1][k-1],dp[i+1][j][k-1],dp[i][j-1][k-1],dp[i][j][k-1]})+(k%mp[i][j]==0?1:0); } int _max=-1; for(int i=0;i<maxn;i++)if(dp[xt][yt][i]>=c){_max=i;break;} printf(\"%d\\n\",_max);}C-拆拆拆数思路:题目只有1和2的情况,如果ab互质则为1,如果不互质n为2,且一定存在答案(第一感觉是这样)。开始我对n=2的情况去构造,发现一直wa(菜哭了),后来A了J题后重新换了100*100暴力枚举两组ai,bi。1234567891011121314151617181920212223242526272829303132#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e9+7;const int mod=1e5+7;int main(){ int t; scanf(\"%d\",&t); while(t--){ ll a,b; scanf(\"%lld%lld\",&a,&b); if(__gcd(a,b)==1){ printf(\"1\\n%lld %lld\\n\",a,b); } else{ int flag=0; for(ll i=2;i<=100;i++){ for(ll j=2;j<=100;j++){ if(__gcd(a-i,b-j)==1&&__gcd(i,j)==1){ printf(\"2\\n%lld %lld\\n\",i,j); printf(\"%lld %lld\\n\",a-i,b-j); flag=1; break; } } if(flag)break; } } } return 0;}E - 流流流动直接连边树形dp计算。需要注意的是图并非联通,可以使用并查集,判断这个集合是否已经处理过。1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950#include<bits/stdc++.h>using namespace std;const int maxn=110;vector<int> e[maxn];void add(int u,int v){e[u].push_back(v),e[v].push_back(u);}int pre[maxn];int fin(int x){return pre[x]==x?x:pre[x]=fin(pre[x]);}void unio(int a,int b){pre[fin(a)]=fin(b);}int f[maxn],d[maxn];long long int dp[maxn][2];bool vis[maxn];void dfs(int u,int pre){ dp[u][1]=f[u]; for(int i=0;i<e[u].size();i++){ int v=e[u][i]; if(v==pre)continue; dfs(v,u); dp[u][0]+=max(dp[v][0],dp[v][1]); dp[u][1]+=max(dp[v][0],dp[v][1]-d[min(u,v)]); }}int main(){ int n; scanf(\"%d\",&n); for(int i=1;i<=n;i++){scanf(\"%d\",&f[i]);pre[i]=i;} for(int i=1;i<=n;i++){scanf(\"%d\",&d[i]);} for(int i=2;i<=n;i++){ if((i&1) && (3*i+1<=n)){ add(i,3*i+1); unio(i,3*i+1); } else if (i%2==0){ add(i,i/2); unio(i,i/2); } } long long ans=0; for(int i=1;i<=n;i++){ int p=fin(i); if(!vis[fin(i)]){ vis[fin(i)]=1; dfs(fin(i),fin(i)); ans+=max(dp[fin(i)][0],dp[fin(i)][1]); } } printf(\"%lld\\n\",ans); return 0;}F-爬爬爬山第一座山的高度确定了,R[1]。当前体力为k,山与山之间的边权为w。那么当后面山的高度大于R[1]+k的时候就需要将山的高度降低。上山消耗体力,下山增加体力,其实就相同高度低于R[1]的时候这个山不存在。因为如果碰到了一个在高的山,增加的体力就被抵消了,相同于没有。那就将边权加上多出来的那部分,(R[x]-(R[1]+k))^2,然后跑最短路就行了。12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758#include<stdio.h>#include<bits/stdc++.h>using namespace std;const int maxn=1e5+10;const long long inf=0x3f3f3f3f3f3f3f3f;long long dis[maxn];bool vis[maxn];struct node{ int u; long long dis; bool operator < (const node &r)const{ return dis>r.dis; }};struct edge{ int v; long long w; int next;}e[maxn*10];int head[maxn*10],hcnt=0;int n,m,k;void add(int u,int v,long long int w){ e[hcnt]=edge{v,w,head[u]}; head[u]=hcnt++;}void dij(int start){ priority_queue<node> que; for(int i=1;i<=n;i++) vis[i]=false,dis[i]=inf; que.push({start,0}); dis[start]=0; while(!que.empty()){ int u=que.top().u; que.pop(); if(vis[u])continue; vis[u]=1; for(int i=head[u];i>=0;i=e[i].next){ int v=e[i].v; if(dis[v]>dis[u]+e[i].w) dis[v]=dis[u]+e[i].w,que.push({v,dis[v]}); } }}long long int r[maxn];int main(){ memset(head,-1,sizeof(head)); scanf(\"%d%d%d\",&n,&m,&k); for(int i=1;i<=n;i++)scanf(\"%lld\",&r[i]); for(int i=1;i<=m;i++){ int u,v,w; scanf(\"%d%d%d\",&u,&v,&w); add(u,v,w+max(0LL,r[v]-(r[1]+k))*max(0LL,r[v]-(r[1]+k))); add(v,u,w+max(0LL,r[u]-(r[1]+k))*max(0LL,r[u]-(r[1]+k))); } dij(1); printf(\"%lld\\n\",dis[n]); return 0;}J-夺宝奇兵思路:看着题比较晚了,一看woc这不就是CF原题嘛,考虑枚举最终票数。枚举完票数就开始处理,把每个党超过这个票数且收钱最少的人收买过来,如果这些人都收买完了可是还没有达到预定的票数,就一直收买之前还没有收买过的学生直到人数达标,就这样巴拉巴拉A了12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061#include<stdio.h>#include<bits\\stdc++.h>using namespace std;typedef long long ll;int n,m,ns,cnt[3005],Sum[3005];struct peo{ int p,c,rk;}a[3005];struct val{ int rk,v;}b[3005];bool vis[3005];ll min_ans=-1,ans;bool cmpa (peo a,peo b){ if(a.p==b.p) return a.c<b.c; return a.p<b.p;}bool cmpb (val a,val b){ return a.v<b.v;}int main(){ scanf(\"%d%d\",&m,&n); for (int i=1;i<=n;++i){ scanf(\"%d%d\",&a[i].c,&a[i].p); a[i].p++; a[i].rk=i; b[i].rk=i; b[i].v=a[i].c; } sort(a+1,a+1+n,cmpa); sort(b+1,b+1+n,cmpb); for (int i=1;i<=n;++i) Sum[ a[i].p ]++; for (int s=1;s<=n;++s){ ns=0; ans=0; memset(vis,0,sizeof(vis)); memset(cnt,0,sizeof(cnt)); for (int j=1;j<=n;++j){ if(a[j].p==1) ns++,vis[ a[j].rk ]=true; else{ if(Sum[ a[j].p ]-cnt[ a[j].p ]>=s){ vis[ a[j].rk ]=true; cnt[ a[j].p ]++; ans+=a[j].c; ns++; } } } for (int i=1;i<=n;++i){ if(ns>=s) break; if(vis[ b[i].rk ]) continue; ns++; ans+=b[i].v; } if(min_ans==-1) min_ans=ans; min_ans=min(ans,min_ans); } cout<<min_ans; return 0;}","categories":[{"name":"2019 Wannafly Winter Camp","slug":"2019-Wannafly-Winter-Camp","permalink":"https://anoyer.cn/categories/2019-Wannafly-Winter-Camp/"}],"tags":[{"name":"Camp","slug":"Camp","permalink":"https://anoyer.cn/tags/Camp/"}]},{"title":"输入外挂总结","slug":"Fread","date":"2019-01-18T09:20:46.000Z","updated":"2019-01-24T04:39:42.010Z","comments":true,"path":"article/Fread.html","link":"","permalink":"https://anoyer.cn/article/Fread.html","excerpt":"","text":"题外话明明在C语言中有scanf()、printf(),C++中有cin、cout,为什么我们还要用输入输出外挂呢?这个问题很明显,一定是因为这些输入输出函数功能过于强大而导致效率低,(很多时候,功能越强大的东西越臃肿),而我们使用的输入输出外挂既然叫外挂,那说明其一定有很大的优势,而这方面优势就体现在术有专攻上。原来的输入输出函数因为要应对不同类型的输入输出,所以内部一定做了很多的判断,而我们在遇见实际问题时,往往都是对特定类型的进行输入输出,所以这些判断就显得无用且浪费资源。这时,我们的输入输出外挂也就有了存在的必要性,也就应运而生。我们都知道,scanf()、printf()、cin、cout其实就是对其他一些基础的获取或输出语句(getchar() putchar()等)进行封装,而这些基础的函数功能弱,效率高,所以我们的输入输出外挂也是仿照着scanf()、printf()、cin、cout来实现的,只不过做了针对性的改造,最终我们改造出来多种功能比scanf()等弱、比getchar()等强,效率比scanf()等高、比gerchar()等低的函数,从而达到针对性的作用,减少了不必要的资源消耗。当然输入输出外挂一般用在大量输入输出的情况下,这样性价比才高一些,否则得不偿失(牺牲了代码长度而换来了微不足道的效率提升)。摘抄原文:https://blog.csdn.net/f_zyj/article/details/51473493普通输入外挂(适用于正整数)12345void read(int &x){ char ch = getchar(); x = 0; for (; ch < '0' || ch > '9'; ch = getchar()); for (; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';}整数输入外挂(适用于整数)123456789101112131415const int BufferSize=1<<16;char buffer[BufferSize],*head,*tail;inline char Getchar() { if(head==tail) { int l=fread(buffer,1,BufferSize,stdin); tail=(head=buffer)+l; } return *head++;}inline int read() { int x=0,f=1;char c=Getchar(); for(;!isdigit(c);c=Getchar()) if(c=='-') f=-1; for(;isdigit(c);c=Getchar()) x=x*10+c-'0'; return x*f;}加强版输入外挂(速度比普通输入外挂快不少)12345678910111213141516171819202122232425262728namespace fastIO {#define BUF_SIZE 100000 //fread -> read bool IOerror = 0; inline char nc() { static char buf[BUF_SIZE], *p1 = buf + BUF_SIZE, *pend = buf + BUF_SIZE; if (p1 == pend) { p1 = buf; pend = buf + fread(buf, 1, BUF_SIZE, stdin); if (pend == p1) { IOerror = 1; return -1; } } return *p1++; } inline bool blank(char ch) { return ch == ' ' || ch == '\\n' || ch == '\\r' || ch == '\\t'; } inline void read(int &x) { char ch; while (blank(ch = nc())); if (IOerror) return; for (x = ch - '0'; (ch = nc()) >= '0' && ch <= '9'; x = x * 10 + ch - '0'); }#undef BUF_SIZE};using namespace fastIO;加强版完整型输入外挂包(速度快,适用于整形,浮点型)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121namespace fastIO{ #define BUF_SIZE 100000 #define OUT_SIZE 100000 #define ll long long //fread->read bool IOerror=0; inline char nc(){ static char buf[BUF_SIZE],*p1=buf+BUF_SIZE,*pend=buf+BUF_SIZE; if (p1==pend){ p1=buf; pend=buf+fread(buf,1,BUF_SIZE,stdin); if (pend==p1){IOerror=1;return -1;} //{printf(\"IO error!\\n\");system(\"pause\");for (;;);exit(0);} } return *p1++; } inline bool blank(char ch){return ch==' '||ch=='\\n'||ch=='\\r'||ch=='\\t';} inline void read(int &x){ bool sign=0; char ch=nc(); x=0; for (;blank(ch);ch=nc()); if (IOerror)return; if (ch=='-')sign=1,ch=nc(); for (;ch>='0'&&ch<='9';ch=nc())x=x*10+ch-'0'; if (sign)x=-x; } inline void read(ll &x){ bool sign=0; char ch=nc(); x=0; for (;blank(ch);ch=nc()); if (IOerror)return; if (ch=='-')sign=1,ch=nc(); for (;ch>='0'&&ch<='9';ch=nc())x=x*10+ch-'0'; if (sign)x=-x; } inline void read(double &x){ bool sign=0; char ch=nc(); x=0; for (;blank(ch);ch=nc()); if (IOerror)return; if (ch=='-')sign=1,ch=nc(); for (;ch>='0'&&ch<='9';ch=nc())x=x*10+ch-'0'; if (ch=='.'){ double tmp=1; ch=nc(); for (;ch>='0'&&ch<='9';ch=nc())tmp/=10.0,x+=tmp*(ch-'0'); } if (sign)x=-x; } inline void read(char *s){ char ch=nc(); for (;blank(ch);ch=nc()); if (IOerror)return; for (;!blank(ch)&&!IOerror;ch=nc())*s++=ch; *s=0; } inline void read(char &c){ for (c=nc();blank(c);c=nc()); if (IOerror){c=-1;return;} } //fwrite->write struct Ostream_fwrite{ char *buf,*p1,*pend; Ostream_fwrite(){buf=new char[BUF_SIZE];p1=buf;pend=buf+BUF_SIZE;} void out(char ch){ if (p1==pend){ fwrite(buf,1,BUF_SIZE,stdout);p1=buf; } *p1++=ch; } void print(int x){ static char s[15],*s1;s1=s; if (!x)*s1++='0';if (x<0)out('-'),x=-x; while(x)*s1++=x%10+'0',x/=10; while(s1--!=s)out(*s1); } void println(int x){ static char s[15],*s1;s1=s; if (!x)*s1++='0';if (x<0)out('-'),x=-x; while(x)*s1++=x%10+'0',x/=10; while(s1--!=s)out(*s1); out('\\n'); } void print(ll x){ static char s[25],*s1;s1=s; if (!x)*s1++='0';if (x<0)out('-'),x=-x; while(x)*s1++=x%10+'0',x/=10; while(s1--!=s)out(*s1); } void println(ll x){ static char s[25],*s1;s1=s; if (!x)*s1++='0';if (x<0)out('-'),x=-x; while(x)*s1++=x%10+'0',x/=10; while(s1--!=s)out(*s1); out('\\n'); } void print(double x,int y){ static ll mul[]={1,10,100,1000,10000,100000,1000000,10000000,100000000, 1000000000,10000000000LL,100000000000LL,1000000000000LL,10000000000000LL, 100000000000000LL,1000000000000000LL,10000000000000000LL,100000000000000000LL}; if (x<-1e-12)out('-'),x=-x;x*=mul[y]; ll x1=(ll)floor(x); if (x-floor(x)>=0.5)++x1; ll x2=x1/mul[y],x3=x1-x2*mul[y]; print(x2); if (y>0){out('.'); for (size_t i=1;i<y&&x3*mul[i]<mul[y];out('0'),++i); print(x3);} } void println(double x,int y){print(x,y);out('\\n');} void print(char *s){while (*s)out(*s++);} void println(char *s){while (*s)out(*s++);out('\\n');} void flush(){if (p1!=buf){fwrite(buf,1,p1-buf,stdout);p1=buf;}} ~Ostream_fwrite(){flush();} }Ostream; inline void print(int x){Ostream.print(x);} inline void println(int x){Ostream.println(x);} inline void print(char x){Ostream.out(x);} inline void println(char x){Ostream.out(x);Ostream.out('\\n');} inline void print(ll x){Ostream.print(x);} inline void println(ll x){Ostream.println(x);} inline void print(double x,int y){Ostream.print(x,y);} //y为小数点后几位 inline void println(double x,int y){Ostream.println(x,y);} inline void print(char *s){Ostream.print(s);} inline void println(char *s){Ostream.println(s);} inline void println(){Ostream.out('\\n');} inline void flush(){Ostream.flush();} //清空 #undef ll #undef OUT_SIZE #undef BUF_SIZE};using namespace fastIO;","categories":[{"name":"C++语法","slug":"C-语法","permalink":"https://anoyer.cn/categories/C-语法/"}],"tags":[{"name":"输入外挂","slug":"输入外挂","permalink":"https://anoyer.cn/tags/输入外挂/"}]},{"title":"C++记录程序运行时间5大方法","slug":"Run-Time","date":"2019-01-18T09:20:23.000Z","updated":"2019-01-24T04:42:29.767Z","comments":true,"path":"article/Run-Time.html","link":"","permalink":"https://anoyer.cn/article/Run-Time.html","excerpt":"","text":"1.用clock()函数用clock()函数,得到系统启动以后的毫秒级时间,然后除以CLOCKS_PER_SEC,就可以换成“秒”,标准c函数。1234clock_t start_time=clock();init();clock_t end_time=clock();cout << \"The run time is: \" <<(double)(end_time - start_time) / CLOCKS_PER_SEC << \"s\" << endl;2.用GetTickCount()函数1234DWORD Start = GetTickCount();//这里运行你的程序代码DWORD End = GetTickCount();//则(End-Start)就是你的程序运行时间, 以毫秒为单位这个函数只精确到55ms,1个tick就是55ms。3.timeGetTime()函数12345DWORD Start = timeGetTime();//这里运行你的程序代码DWORD End = timeGetTime();//则(End-Start)就是你的程序运行时间, 以毫秒为单位//虽然返回的值单位应该是ms,但精度只有10ms。4.使用Boost库中的timertimer类可以测量时间的流逝,是小型计时器,提供毫秒级别的计时精度。头文件:#include<boost/timer.hpp>123timer t;//声明计时器对象并开始计时 //...测试代码cout<<\"运行时间:\"<<t.elapsed() <<\"s\"<<endl;//输出已流失的时间5.高精度时控函数QueryPerformanceFrequency(),QueryPerformanceCounter()QueryPerformanceCounter()这个函数返回高精确度性能计数器的值,它可以以微妙为单位计时.但是QueryPerformanceCounter()确切的精确计时的最小单位是与系统有关的,所以,必须要查询系统以得到QueryPerformanceCounter()返回的嘀哒声的频率.QueryPerformanceFrequency()提供了这个频率值,返回每秒嘀哒声的个数.计算确切的时间是从第一次调用QueryPerformanceCounter()开始的假设得到的LARGE_INTEGER为nStartCounter,过一段时间后再次调用该函数结束的,设得到nStopCounter.两者之差除以QueryPerformanceFrequency()的频率就是开始到结束之间的秒数.由于计时函数本身要耗费很少的时间,要减去一个很少的时间开销.但一般都把这个开销忽略。头文件:#include<windows.h>1234567891011double time=0; double counts=0; LARGE_INTEGER nFreq; LARGE_INTEGER nBeginTime; LARGE_INTEGER nEndTime; QueryPerformanceFrequency(&nFreq); QueryPerformanceCounter(&nBeginTime);//开始计时 //...测试代码QueryPerformanceCounter(&nEndTime);//停止计时 time=(double)(nEndTime.QuadPart-nBeginTime.QuadPart)/(double)nFreq.QuadPart;//计算程序执行时间单位为s cout<<\"运行时间:\"<<time*1000<<\"ms\"<<endl;","categories":[{"name":"C++语法","slug":"C-语法","permalink":"https://anoyer.cn/categories/C-语法/"}],"tags":[{"name":"语法","slug":"语法","permalink":"https://anoyer.cn/tags/语法/"}]},{"title":"Henau-2018训练题1","slug":"henau-test1","date":"2018-12-22T10:48:03.000Z","updated":"2019-01-24T04:41:16.389Z","comments":true,"path":"article/henau-test1.html","link":"","permalink":"https://anoyer.cn/article/henau-test1.html","excerpt":"","text":"小刘爱复读12345678910111213141516#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e3 + 10;const int mod = 1e9 + 7;//把诗歌存入字符串char s[maxn] = \"I am the bone of my language repeater plastic is my body and wire is my blood I have created over a thousand copies Unknown to Death Nor known to Life Have withstood pain to create copies Yet,those hands will never hold anything So as I pray,unlimited repeat works\";int main(){ int len = strlen(s), cnt = 0; //cnt表示字母个数 for (int i = 0; i < len; i++){//遍历一遍字符串 if ((s[i] >= 'a'&&s[i] <= 'z') || (s[i] >= 'A'&&s[i] <= 'Z'))cnt++; //如果当前字符是个字母,则cnt++; } printf(\"%d\\n\", cnt); return 0;}洋洋爱模仿12345678910111213141516171819#include<stdio.h>#include<bits/stdc++.h>using namespace std;const int maxn = 1e5 + 7;char s[maxn], t[maxn];int main(){ int T; scanf(\"%d\", &T); while (T--){ int ans = 0; //ans表示s,t串相同位相同字符个数 scanf(\"%s\", s); scanf(\"%s\", t); int len = strlen(s); //获取串长度 for (int i = 0; i < len; i++) //for遍历字符串 if (s[i] == t[i])ans++; //如果发现一个s[i]和t[i]相同,ans++; printf(\"%.2f\\n\", (double)ans / (double)len); //ans/总字符数=相似度 } return 0;}小温爱蔬菜123456789101112131415161718192021222324252627#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e5 + 10;const int mod = 1e9 + 7;int sum[maxn]; //前缀和int main(){ int t; scanf(\"%d\", &t); while (t--){ int n, a, m; scanf(\"%d%d\", &n, &m); sum[0] = 0; for (int i = 1; i <= n; i++){ scanf(\"%d\", &sum[i]); sum[i] += sum[i - 1]; //获取a数组的前缀和表 } while (m--){ int l, r; scanf(\"%d%d\", &l, &r); //前缀和性质:sum[r]-sum[l-1]=a[l]+....+a[r] printf(\"%d\\n\", sum[r] - sum[l - 1]); } } return 0;}洋洋爱密码12345678910111213141516171819202122232425262728#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e5 + 10;const int mod = 1e9 + 7;int a[maxn];bool cmp(int a, int b){ return a > b;}int main(){ int t; scanf(\"%d\", &t); while (t--){ int n, cnt = 0, ans = 0; //ans用来记录当前所花费金额 scanf(\"%d\", &n); for (int i = 0; i < n; i++){ scanf(\"%d\", &a[i]); } sort(a, a + n, cmp); //先对物品价格从大到小排序 for (int i = 0; i < n; i++){ ans += a[i]; if (ans >= 30)cnt++; //如果sum>=30,则cnt++,输入密码次数cnt++ } printf(\"%d\\n\", cnt); } return 0;}","categories":[{"name":"农大训练赛题解","slug":"农大训练赛题解","permalink":"https://anoyer.cn/categories/农大训练赛题解/"}],"tags":[{"name":"河南农业大学训练赛题解","slug":"河南农业大学训练赛题解","permalink":"https://anoyer.cn/tags/河南农业大学训练赛题解/"}]},{"title":"SPOJ - REPEATS - Repeats(RMQ+后缀数组)","slug":"SPOJ-REPEATS-Repeats","date":"2018-12-07T14:20:38.000Z","updated":"2019-01-24T04:42:33.502Z","comments":true,"path":"article/SPOJ-REPEATS-Repeats.html","link":"","permalink":"https://anoyer.cn/article/SPOJ-REPEATS-Repeats.html","excerpt":"","text":"博主链接题目链接题意:对于给出的字符串(长度<= 50000,只包含字符’a’或’b’)找到最大的k使得存在某个字符串t重复k次是给出的字符串的子串题解:如果每一个循环节的长度为len, 那么在原字符串S中, S[ilen]与S[(i + 1)len]一定会被包含在答案的子串当中那么枚举可能的答案的循环节的长度, 然后枚举可能的位置, 对于每一组可能被包含的位置S[ilen], S[(i + 1)len]求出其对应后缀的最长公共前缀长度L, 则该循环节至少循环了L/len + 1次, 但是当L%len != 0时, 后面多余出来的部分(长度L%len的部分)可能和前面的拼凑成循环节, 于是对于位置ilen - (len - L % len)和(i + 1)len - (len - L % len)求其后缀的最长公共前缀长度, 如果大于之前的结果,自然就说明从这个位置开始可以比之前多一个循环节, 于是这样枚举得到最多循环次数代码:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126#include<stdio.h>#include<string.h>#include<map>#include<algorithm>#include<iostream>#include<math.h>using namespace std;#define REP(i,n) for(i=0;i<(n);++i)#define UPTO(i,l,h) for(i=(l);i<=(h);++i)#define DOWN(i,h,l) for(i=(h);i>=(l);--i)const int maxn=1e6+10;const int mod=1e9+7;typedef long long ll;template <typename T, int LEN>struct suffixarray{ //rank[i] 第i个后缀的排名; SA[i] 排名为i的后缀位置; Height[i] 排名为i的后缀与排名为(i-1)的后缀的LCP int str[LEN*3],sa[LEN*3]; int rank[LEN],height[LEN]; int id[LEN]; int best[LEN][20]; int len; bool equal(int *str, int a, int b){ return str[a]==str[b]&&str[a+1]==str[b+1]&&str[a+2]==str[b+2]; } bool cmp3(int *str, int *nstr, int a, int b){ if(str[a]!=str[b])return str[a]<str[b]; if(str[a+1]!=str[b+1])return str[a+1]<str[b+1]; return nstr[a+b%3]<nstr[b+b%3]; } void radixsort(int *str, int *sa, int *res, int n, int m){ int i; REP(i,m)id[i]=0; REP(i,n)++id[str[sa[i]]]; REP(i,m)id[i+1]+=id[i]; DOWN(i,n-1,0)res[--id[str[sa[i]]]]=sa[i]; } void dc3(int *str, int *sa, int n, int m){ #define F(x) ((x)/3+((x)%3==1?0:one)) #define G(x) ((x)<one?(x)*3+1:((x)-one)*3+2) int *nstr=str+n, *nsa=sa+n, *tmpa=rank, *tmpb=height; int i,j,k,len=0,num=0,zero=0,one=(n+1)/3; REP(i,n)if(i%3)tmpa[len++]=i; str[n]=str[n+1]=0; radixsort(str+2, tmpa, tmpb, len, m); radixsort(str+1, tmpb, tmpa, len, m); radixsort(str+0, tmpa, tmpb, len, m); nstr[F(tmpb[0])]=num++; UPTO(i,1,len-1) nstr[F(tmpb[i])]=equal(str,tmpb[i-1],tmpb[i])?num-1:num++; if(num<len)dc3(nstr,nsa,len,num); else REP(i,len)nsa[nstr[i]]=i; if(n%3==1)tmpa[zero++]=n-1; REP(i,len)if(nsa[i]<one)tmpa[zero++]=nsa[i]*3; radixsort(str, tmpa, tmpb, zero, m); REP(i,len)tmpa[nsa[i]=G(nsa[i])]=i; i=j=0; REP(k,n) if(j>=len||(i<zero&&cmp3(str,tmpa,tmpb[i],nsa[j])))sa[k]=tmpb[i++]; else sa[k]=nsa[j++]; } void initSA(T *s, int n,int m){ int i,j,k=0; str[len=n]=0;//末尾增加一个0,这样就省去一些特殊情况的讨论,也就是最后一个mod 3刚好等于0 REP(i,n)str[i]=s[i]; dc3(str,sa,n+1,m); //可以切换成dc3 REP(i,n)sa[i]=sa[i+1];//第0小的默认为最后一个字符0,所以答案向前移动一位,da算法不用 //da(str,sa,n,m); REP(i,n)rank[sa[i]]=i; REP(i,n)//计算height数组 { if(k)--k; if(rank[i])for(j=sa[rank[i]-1];str[i+k]==str[j+k];++k); else k=0; height[rank[i]]=k; } } void initRMQ(){ int i,j; int m=(int)(log(len*1.0)/log(2.0)); REP(i,len)best[i][0]=height[i]; for(j=1;j<=m;++j) for(i=0;i+(1<<j)-1<len;++i) best[i][j]=min(best[i][j-1],best[i+(1<<(j-1))][j-1]); } int RMQ(int l, int r){ int k=int(log(r-l+1.0)/log(2.0)); return min(best[l][k],best[r-(1<<k)+1][k]); } int LCPSA(int a, int b){//查询区间RMQ(i,j) a=rank[a],b=rank[b]; if(a>b)swap(a,b); return RMQ(a+1,b); }};suffixarray<int,maxn> msa;map<int ,int > mymap; //计算m,m表示不同字符个数,如果是字母直接用256char s[maxn];int ss[maxn];int main(){ int t,Max=0,ans,k; scanf(\"%d\",&t); while(t--){ int len; Max=1; scanf(\"%d\",&len); for(int i=0;i<len;i++){ scanf(\"%s\",s); ss[i]=s[0]-'a'+1; } msa.initSA(ss,len,4); msa.initRMQ(); for(int i=1;i<=len;i++){ //枚举长度 for(int j=0;j+i<len;j+=i){ //+i极大的降低了复杂度 //但也产生了需要向前比较的问题 ans=msa.LCPSA(j,j+i); //公共后缀的长度 k=j-(i-ans%i); //前推到k位置 ans=ans/i+1; //出现次数 if(k>=0&&msa.LCPSA(k,k+i)>=i)ans++; //printf(\"L=%d,R=%d\\n\",i,ans); Max=max(Max,ans); } } printf(\"%d\\n\",Max); } return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"字符串题解","slug":"字符串题解","permalink":"https://anoyer.cn/tags/字符串题解/"},{"name":"后缀数组","slug":"后缀数组","permalink":"https://anoyer.cn/tags/后缀数组/"},{"name":"SPOJ","slug":"SPOJ","permalink":"https://anoyer.cn/tags/SPOJ/"}]},{"title":"后缀自动机DC3模板","slug":"Suffix-Array-DC3","date":"2018-12-06T15:11:27.000Z","updated":"2019-01-24T04:42:41.063Z","comments":true,"path":"article/Suffix-Array-DC3.html","link":"","permalink":"https://anoyer.cn/article/Suffix-Array-DC3.html","excerpt":"","text":"后缀数组一些性质suffix(j)和suffix(k)的最长公共前缀为height【rank【j】+1】到height【rank【k】】中的最小值;待更新123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116/*POJ-2406*/#include<stdio.h>#include<string.h>#include<map>#include<algorithm>using namespace std;#define REP(i,n) for(i=0;i<(n);++i)#define UPTO(i,l,h) for(i=(l);i<=(h);++i)#define DOWN(i,h,l) for(i=(h);i>=(l);--i)const int maxn=1e6+10;const int mod=1e9+7;typedef long long ll;template <typename T, int LEN>struct suffixarray{ //rank[i] 第i个后缀的排名; SA[i] 排名为i的后缀位置; Height[i] 排名为i的后缀与排名为(i-1)的后缀的LCP int str[LEN*3],sa[LEN*3]; int rank[LEN],height[LEN]; int id[LEN]; int best[LEN][20]; int len; bool equal(int *str, int a, int b){ return str[a]==str[b]&&str[a+1]==str[b+1]&&str[a+2]==str[b+2]; } bool cmp3(int *str, int *nstr, int a, int b){ if(str[a]!=str[b])return str[a]<str[b]; if(str[a+1]!=str[b+1])return str[a+1]<str[b+1]; return nstr[a+b%3]<nstr[b+b%3]; } void radixsort(int *str, int *sa, int *res, int n, int m){ int i; REP(i,m)id[i]=0; REP(i,n)++id[str[sa[i]]]; REP(i,m)id[i+1]+=id[i]; DOWN(i,n-1,0)res[--id[str[sa[i]]]]=sa[i]; } void dc3(int *str, int *sa, int n, int m){ #define F(x) ((x)/3+((x)%3==1?0:one)) #define G(x) ((x)<one?(x)*3+1:((x)-one)*3+2) int *nstr=str+n, *nsa=sa+n, *tmpa=rank, *tmpb=height; int i,j,k,len=0,num=0,zero=0,one=(n+1)/3; REP(i,n)if(i%3)tmpa[len++]=i; str[n]=str[n+1]=0; radixsort(str+2, tmpa, tmpb, len, m); radixsort(str+1, tmpb, tmpa, len, m); radixsort(str+0, tmpa, tmpb, len, m); nstr[F(tmpb[0])]=num++; UPTO(i,1,len-1) nstr[F(tmpb[i])]=equal(str,tmpb[i-1],tmpb[i])?num-1:num++; if(num<len)dc3(nstr,nsa,len,num); else REP(i,len)nsa[nstr[i]]=i; if(n%3==1)tmpa[zero++]=n-1; REP(i,len)if(nsa[i]<one)tmpa[zero++]=nsa[i]*3; radixsort(str, tmpa, tmpb, zero, m); REP(i,len)tmpa[nsa[i]=G(nsa[i])]=i; i=j=0; REP(k,n) if(j>=len||(i<zero&&cmp3(str,tmpa,tmpb[i],nsa[j])))sa[k]=tmpb[i++]; else sa[k]=nsa[j++]; } void initSA(T *s, int n,int m){ int i,j,k=0; str[len=n]=0;//末尾增加一个0,这样就省去一些特殊情况的讨论,也就是最后一个mod 3刚好等于0 REP(i,n)str[i]=s[i]; dc3(str,sa,n+1,m); //可以切换成dc3 REP(i,n)sa[i]=sa[i+1];//第0小的默认为最后一个字符0,所以答案向前移动一位,da算法不用 //da(str,sa,n,m); REP(i,n)rank[sa[i]]=i; REP(i,n)//计算height数组 { if(k)--k; if(rank[i])for(j=sa[rank[i]-1];str[i+k]==str[j+k];++k); else k=0; height[rank[i]]=k; } } void initRMQ(){ int i,j; int m=(int)(log(len*1.0)/log(2.0)); REP(i,len)best[i][0]=height[i]; for(j=1;j<=m;++j) for(i=0;i+(1<<j)-1<len;++i) best[i][j]=min(best[i][j-1],best[i+(1<<(j-1))][j-1]); } int RMQ(int l, int r){ int k=int(log(r-l+1.0)/log(2.0)); return min(best[l][k],best[r-(1<<k)+1][k]); } int LCPSA(int a, int b){//查询区间RMQ(i,j) a=rank[a],b=rank[b]; if(a>b)swap(a,b); return RMQ(a+1,b); }};suffixarray<char,maxn> msa;map<int ,int > mymap; //计算m,m表示不同字符个数,如果是字母直接用256char s[maxn];int main(){ while(scanf(\"%s\",s)){ if(s[0]=='.')break; int len= strlen(s); msa.initSA(s,len,256); int flag = 0; for (int i = 1; i <= len; i++) { if (len % i == 0 && msa.rank[0] == msa.rank[i] + 1 && msa.height[msa.rank[0]] == len - i) { printf(\"%d\\n\", len / i); flag = 1; break; } } if (!flag)printf(\"1\\n\"); } return 0;}一些模板利用求重复次数最多的连续重复子串例题:SPOJ - REPEATS-Repeats12345678910111213msa.initRMQ();for(int i=1;i<=len;i++){ //枚举长度 for(int j=0;j+i<len;j+=i){ //+i极大的降低了复杂度 //但也产生了需要向前比较的问题 ans=msa.LCPSA(j,j+i); //公共后缀的长度 k=j-(i-ans%i); //前推到k位置 ans=ans/i+1; //出现次数 if(k>=0&&msa.LCPSA(k,k+i)>=i)ans++; //printf(\"L=%d,R=%d\\n\",i,ans); Max=max(Max,ans); }}printf(\"%d\\n\",Max);求最小循环节例题:POJ-2406 - Power Strings123456789int flag = 0;for (int i = 1; i <= len; i++) { if (len % i == 0 && msa.rank[0] == msa.rank[i] + 1 && msa.height[msa.rank[0]] == len - i) { printf(\"%d\\n\", len / i); flag = 1; break; }}if (!flag)printf(\"1\\n\");求两串中长度大于k的公共子串有多少个。例题:POJ - 3415 - Common Substrings1234567891011121314151617181920212223242526272829303132333435363738394041ll solve(int k){ int top=0; ll ans=0,tot=0; for(int i=1;i<n;i++){ if(msa.height[i]<k)tot=0,top=0; else{ int cnt=0; if(msa.sa[i-1]<lena){ //说明不在同一串中 cnt++; tot+=msa.height[i]-k+1; } while(top&&msa.height[i]<=sta[top-1][0]){ top--; tot+=(msa.height[i]-sta[top][0])*sta[top][1]; cnt+=sta[top][1]; } sta[top][0]=msa.height[i],sta[top++][1]=cnt; if(msa.sa[i]>lena)ans+=tot; } } tot=top=0; for(int i=1;i<n;i++){ if(msa.height[i]<k)tot=0,top=0; else{ int cnt=0; if(msa.sa[i-1]>lena){ //说明不在同一串中 cnt++; tot+=msa.height[i]-k+1; } while(top&&msa.height[i]<=sta[top-1][0]){ top--; tot+=(msa.height[i]-sta[top][0])*sta[top][1]; cnt+=sta[top][1]; } sta[top][0]=msa.height[i],sta[top++][1]=cnt; if(msa.sa[i]<lena)ans+=tot; } } return ans;}","categories":[{"name":"字符串模板","slug":"字符串模板","permalink":"https://anoyer.cn/categories/字符串模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"HDU-3336-Count the string(KMP-Next数组性质)","slug":"HDU-3336-Count-the-string(KMP-Next数组性质)","date":"2018-12-05T12:56:24.000Z","updated":"2019-01-24T04:40:39.234Z","comments":true,"path":"article/HDU-3336-Count-the-string(KMP-Next数组性质).html","link":"","permalink":"https://anoyer.cn/article/HDU-3336-Count-the-string(KMP-Next数组性质).html","excerpt":"","text":"博主链接题目链接题意:求一个串中所有前缀子串出现次数之和题解:对于每个串他前缀串出现次数和一定大于或等于n,因为有n个前缀;所以此时只需要去计算一下每一个前缀在后面出现了几次,也就是next数组的值。结合next数组的性质可以很容易得知,next数组中存在一个非0位,就出现了一种前缀,ans就++。所以只需对字符串求一遍next数组,统计都是个非零元素就可以了。代码:12345678910111213141516171819202122232425262728293031323334#include<stdio.h>#include<bits/stdc++.h>#define met(a) memset(a,0,sizeof(a))#define fup(i,a,n,b) for(int i=a;i<n;i+=b)#define fow(j,a,n,b) for(int j=a;j>0;j-=b)#define MOD(x) (x)%modusing namespace std;const int maxn = 2*1e6 + 10;const int mod = 1e9 + 7;typedef long long ll;char s[maxn];int nex[maxn];void Get_nex() { int j = 0; for (int i = 1; s[i]; i++) { while (s[i] != s[j + 1] && j != 0)j = nex[j]; if (s[i] == s[j + 1] && i != 1)j++; nex[i] = j; }}int main() { int t,n; scanf(\"%d\", &t); while (t--) { scanf(\"%d\", &n); scanf(\"%s\", s+1); int ans = 0; Get_nex(); for (int i = 1; i <=n; i++) { if (nex[i] != 0)ans++; } printf(\"%d\\n\", (n + ans) % 10007); }}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"HDU","slug":"HDU","permalink":"https://anoyer.cn/tags/HDU/"},{"name":"KMP","slug":"KMP","permalink":"https://anoyer.cn/tags/KMP/"},{"name":"字符串题解","slug":"字符串题解","permalink":"https://anoyer.cn/tags/字符串题解/"}]},{"title":"POJ-2406-Power Strings(循环节)","slug":"POJ-2406-Power-Strings","date":"2018-12-05T12:54:16.000Z","updated":"2019-01-24T04:42:01.898Z","comments":true,"path":"article/POJ-2406-Power-Strings.html","link":"","permalink":"https://anoyer.cn/article/POJ-2406-Power-Strings.html","excerpt":"","text":"博主链接题目链接题意:给我们一个字符串,我们要求出它最多由几个相同的连续子串连接而成。也就是求最小循环节题解:先注意到如果他是循环子串那么n-next[n]一定是最小循环节。于是可以先求出nxt然后暴力匹配一遍看看。但是事实上只要满足n%(n-next[n])==0就可以保证答案正确了。代码:123456789101112131415161718192021222324252627#include<stdio.h>#include<cstring>#include<algorithm>using namespace std;const int maxn=1e6+10;char s[maxn];int Next[maxn];void Get_Nex(){ int j=-1; for(int i=0;s[i];i++){ while(s[i]!=s[j+1]&&j!=-1)j=Next[j]; if(s[i]==s[j+1]&i!=0)j++; Next[i]=j; }}int main(){ while(scanf(\"%s\",s)){ if(s[0]=='.')break; Get_Nex(); int ans=1; int len=strlen(s); int L=Next[len-1]; if(len%(len-L-1)==0)ans=len/(len-L-1); printf(\"%d\\n\",ans); } return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"KMP","slug":"KMP","permalink":"https://anoyer.cn/tags/KMP/"},{"name":"字符串题解","slug":"字符串题解","permalink":"https://anoyer.cn/tags/字符串题解/"},{"name":"POJ","slug":"POJ","permalink":"https://anoyer.cn/tags/POJ/"}]},{"title":"POJ - 3974 - Palindrome(裸马拉车)","slug":"POJ-3974-Palindrome-裸马拉车","date":"2018-12-05T12:51:13.000Z","updated":"2019-01-24T04:42:19.448Z","comments":true,"path":"article/POJ-3974-Palindrome-裸马拉车.html","link":"","permalink":"https://anoyer.cn/article/POJ-3974-Palindrome-裸马拉车.html","excerpt":"","text":"博主链接题目链接题意:给一个字符串,求连续最长的回文子串的长度。题解:利用Manacher算法,裸的模板题,不多说了。不懂Manacher算法—-见Manacher最长回文串算法代码:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657#include<stdio.h>#include<algorithm>#include<cstring>#define met(a) memset(a,0,sizeof(a));using namespace std;typedef long long ll;const int maxn = 1000050;char s[maxn];char s_new[maxn * 2];int p[maxn * 2];int Init(){ int len = strlen(s); s_new[0] = '$'; s_new[1] = '#'; int j = 2; for (int i = 0; i < len; i++){ s_new[j++] = s[i]; s_new[j++] = '#'; } s_new[j] = '\\0'; //printf(\"%s\\n\",s_new); return j; //返回s_new的长度 }int Manacher(){ int len = Init(); //取得新字符串长度并完成向s_new的转换 int maxLen = -1; //最长回文长度 int id; int mx = 0; for (int i = 1; i < len; i++){ if (i < mx) p[i] = min(p[2 * id - i], mx - i); //需搞清楚上面那张图含义, mx和2*id-i的含义 else p[i] = 1; while (s_new[i - p[i]] == s_new[i + p[i]]) //不需边界判断,因为左有'$',右有'\\0' p[i]++; //我们每走一步i,都要和mx比较,我们希望mx尽可能的远,这样才能更有机会执行if (i < mx)这句代码,从而提高效率 if (mx < i + p[i]) { id = i; mx = i + p[i]; } maxLen = max(maxLen, p[i] - 1); // printf(\"%d %d %d\\n\",mx,id,maxLen); } /*for(int i=1;i<=len;i++)printf(\"%d \",p[i]); printf(\"\\n\");*/ return maxLen;}int main(){ int t = 0; while (scanf(\"%s\", s)){ t++; memset(p, 0, sizeof(p)); if (s[0] == 'E'&&s[1] == 'N'&&s[2] == 'D')break; printf(\"Case %d: %d\\n\", t, Manacher()); } return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"字符串题解","slug":"字符串题解","permalink":"https://anoyer.cn/tags/字符串题解/"},{"name":"Manacher","slug":"Manacher","permalink":"https://anoyer.cn/tags/Manacher/"},{"name":"POJ","slug":"POJ","permalink":"https://anoyer.cn/tags/POJ/"}]},{"title":"HDU-3746-Cyclic Nacklace (KMP求循环节)","slug":"HDU-3746-Cyclic-Nacklace-(KMP求循环节)","date":"2018-12-05T12:49:32.000Z","updated":"2019-01-24T04:40:47.319Z","comments":true,"path":"article/HDU-3746-Cyclic-Nacklace-(KMP求循环节).html","link":"","permalink":"https://anoyer.cn/article/HDU-3746-Cyclic-Nacklace-(KMP求循环节).html","excerpt":"","text":"博主链接题目链接Sample Input12345>3>aaa>abca>abcde>Sample Output1234> 0> 2> 5>题意:给你一些串,问如果想让这个串里面的循环节至少循环两次,需要添加几个字符(只能在最前面或者最后面添加)。比如ababc 需要添加5个就是添加ababc。题解:利用Next数组的性质:符合 i % ( i - next[i] ) == 0 && next[i] != 0 , 则**说明字符串循环,而且**循环节长度为: i - next[i]循环次数为: i / ( i - next[i] )代码:123456789101112131415161718192021222324252627282930313233#include <stdio.h>#include <string.h>const int N = 1e5+5;int n, next[N];char str[N];void getNext () { n = strlen (str+1); int p = 0; for (int i = 2; i <= n; i++) { while (p > 0 && str[p+1] != str[i]) p = next[p]; if (str[p+1] == str[i]) p++; next[i] = p; }}int main () { int cas; scanf(\"%d\", &cas); while (cas--) { scanf(\"%s\", str+1); getNext(); int n= strlen (str+1); if (next[n] == 0) printf(\"%d\\n\", n); else { int k = n - next[n]; if (n%k == 0) printf(\"0\\n\"); else printf(\"%d\\n\", k - (n - (n/k) * k)); } } return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"HDU","slug":"HDU","permalink":"https://anoyer.cn/tags/HDU/"},{"name":"KMP","slug":"KMP","permalink":"https://anoyer.cn/tags/KMP/"},{"name":"字符串题解","slug":"字符串题解","permalink":"https://anoyer.cn/tags/字符串题解/"}]},{"title":"Codeforces Round #525 (Div. 2) -C. Ehab and a 2-operation task","slug":"Codeforces-Round-525-Div-2-C-Ehab-and-a-2-operation-task","date":"2018-12-04T16:25:42.000Z","updated":"2019-01-24T04:39:36.761Z","comments":true,"path":"article/Codeforces-Round-525-Div-2-C-Ehab-and-a-2-operation-task.html","link":"","permalink":"https://anoyer.cn/article/Codeforces-Round-525-Div-2-C-Ehab-and-a-2-operation-task.html","excerpt":"","text":"博主链接题目链接**Note** In the first sample, the array is already increasing so we don't need any operations. In the second sample: In the first step: the array becomes [8,6,3]. In the second step: the array becomes [0,2,3]. 题意:给你一个n,然后n个数a[1~n],现在你可以对数组进行两种操作:对a[1~i]所有的数+x对a[1~i]所有的数对x取模要求你在n+1次操作内将数组a变成一个递增序列,并输出每次的操作(答案不唯一)题解:答案说了可以n+1次,那么就先对每个位置都进行一次操作1,让所有数在着n次1操作结束后对n取模值等于下表i,因为每次操作影响范围为1~i,所以可以选择倒着扫,保证处理过的数不会再变化。最后进行一次操作2,对1~n进行对n取模123456789101112131415161718192021222324#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e4+7;const int mod=1e9+7;int a[maxn];int main(){ int n; cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } cout<<n+1<<endl; ll sum=0; int ans=0; for(int i=n;i>=1;i--){ ans=(i-(a[i]+sum)%(n+1)+n+1)%(n+1); printf(\"1 %d %d\\n\",i,ans); sum+=ans; } printf(\"2 %d %d\\n\",n,n+1); return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"codeforces","slug":"codeforces","permalink":"https://anoyer.cn/tags/codeforces/"},{"name":"思维题","slug":"思维题","permalink":"https://anoyer.cn/tags/思维题/"}]},{"title":"Codeforces Round #525 (Div. 2)-B. Ehab and subtraction","slug":"Codeforces-Round-525-Div-2-B-Ehab-and-subtraction","date":"2018-12-04T16:22:50.000Z","updated":"2019-01-24T04:39:35.110Z","comments":true,"path":"article/Codeforces-Round-525-Div-2-B-Ehab-and-subtraction.html","link":"","permalink":"https://anoyer.cn/article/Codeforces-Round-525-Div-2-B-Ehab-and-subtraction.html","excerpt":"","text":"博主链接题目链接NoteIn the first sample:In the first step: the array is [1,2,3][1,2,3], so the minimum non-zero element is 1.In the second step: the array is [0,1,2][0,1,2], so the minimum non-zero element is 1.In the third step: the array is [0,0,1][0,0,1], so the minimum non-zero element is 1.In the fourth and fifth step: the array is [0,0,0][0,0,0], so we printed 0.In the second sample:In the first step: the array is [10,3,5,3][10,3,5,3], so the minimum non-zero element is 3.In the second step: the array is [7,0,2,0][7,0,2,0], so the minimum non-zero element is 2.题意:给你两个整数n,k,然后n个整数a[1~n]。然后进行k次操作,每次操作打印出最小非零元素,并把所有非零元素减去这个数;如果没有没有非零数了就打印零题解:先用sort对a排序,然后从最小位置开始消,同时定义一个变量sum,记录每一次操作前面减去数字的和,也就是当前位置需要减的数字。同时特判下当前位置数-sum==0,如果为真直接跳过看下一位,同时因为跳过了所以一定要k++;代码:1234567891011121314151617181920212223242526#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e5+7;const int mod=1e9+7;int a[maxn];int main(){ int n,k; scanf(\"%d%d\",&n,&k); for(int i=0;i<n;i++)scanf(\"%d\",&a[i]); sort(a,a+n); ll sum=0; for(int i=0;i<k;i++){ if(i>=n)printf(\"0\\n\"); else{ if(a[i]-sum==0){ k++; continue; } printf(\"%d\\n\",a[i]-sum); sum=a[i]; } } return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"codeforces","slug":"codeforces","permalink":"https://anoyer.cn/tags/codeforces/"},{"name":"思维题","slug":"思维题","permalink":"https://anoyer.cn/tags/思维题/"}]},{"title":"Codeforces Round #525 (Div. 2) (2)-A. Ehab and another construction problem","slug":"Codeforces-Round-525-Div-2-2-A-Ehab-and-another-construction-problem","date":"2018-12-04T16:19:49.000Z","updated":"2019-01-24T04:39:35.621Z","comments":true,"path":"article/Codeforces-Round-525-Div-2-2-A-Ehab-and-another-construction-problem.html","link":"","permalink":"https://anoyer.cn/article/Codeforces-Round-525-Div-2-2-A-Ehab-and-another-construction-problem.html","excerpt":"","text":"博主链接题目链接题意:给你一个x,让你求出两个整数a,b,满足他给的那些条件题解:数据范围很小就100,直接O(n*n)暴力枚举就可以了代码:1234567891011121314151617181920#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e6+7;const int mod=1e9+7;int main(){ int x; scanf(\"%d\",&x); for(int i=1;i<=x;i++){ for(int j=1;j<=i;j++){ if(i%j==0&&j*i>x){ printf(\"%d %d\\n\",i,j); return 0; } } } printf(\"-1\\n\"); return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"codeforces","slug":"codeforces","permalink":"https://anoyer.cn/tags/codeforces/"},{"name":"暴力题","slug":"暴力题","permalink":"https://anoyer.cn/tags/暴力题/"}]},{"title":"HDU-2328-Corporate Identity(利用string函数)","slug":"HDU-2328-Corporate-Identity-利用string函数","date":"2018-12-04T13:27:43.000Z","updated":"2019-01-24T04:40:17.815Z","comments":true,"path":"article/HDU-2328-Corporate-Identity-利用string函数.html","link":"","permalink":"https://anoyer.cn/article/HDU-2328-Corporate-Identity-利用string函数.html","excerpt":"","text":"博主链接题目链接题意:给你n个字符串,问你这n个串的最长公共子串题解:题目和HDU-1238感觉差不多,暴力枚举任意一个字符串的所有子串,然后暴力匹配,这里用string解决的;代码:123456789101112131415161718192021222324252627282930313233343536373839404142#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=4050;const int mod=1e9+7;string s[maxn];int main(){ int n; ios::sync_with_stdio(0); while((cin>>n)&&n!=0){ for(int i=1;i<=n;i++){ cin>>s[i]; } string t; int cot=0; int maxx=0; int len=s[1].size(); for(int i=0;i<len;i++){ for(int j=1;j<=len-i;j++){ //枚举子串长度 if(j<maxx)continue; cot=0; for(int k=2;k<=n;k++){ if(s[k].find(s[1].substr(i,j))==string::npos)break; //string函数查找 else cot++; } if(cot==n-1){ //如果这个子串出现了n-1次,选取的那个串本身就有一次,则维护maxx if(maxx<j){ maxx=j; t=s[1].substr(i,j); } else if(maxx==j){ if(t>s[1].substr(i,j))t=s[1].substr(i,j); } } } } if(maxx==0)cout<<\"IDENTITY LOST\"<<endl; else cout<<t<<endl; } return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"暴力题","slug":"暴力题","permalink":"https://anoyer.cn/tags/暴力题/"},{"name":"HDU","slug":"HDU","permalink":"https://anoyer.cn/tags/HDU/"},{"name":"字符串题解","slug":"字符串题解","permalink":"https://anoyer.cn/tags/字符串题解/"},{"name":"STL","slug":"STL","permalink":"https://anoyer.cn/tags/STL/"}]},{"title":"HDU-1238-Substrings(求公共子串)","slug":"HDU-1238-Substrings-求公共子串","date":"2018-12-04T13:26:00.000Z","updated":"2019-01-24T04:39:51.281Z","comments":true,"path":"article/HDU-1238-Substrings-求公共子串.html","link":"","permalink":"https://anoyer.cn/article/HDU-1238-Substrings-求公共子串.html","excerpt":"","text":"博主链接题目链接题意:找出所有字符串中共同拥有的一个子串,该子串(正、逆字符)是任何一个母串的子串,求该子串的最长长度。题解:利用string库里的find函数+STL中的reverse反转函数。先找出最短的母串,即该符合要求的子串肯定在这个母串中,即在从长到短,从最短母串中取子串,在子串正反去查看是否符合要求。代码:12345678910111213141516171819202122232425262728293031323334353637383940#include<stdio.h>#include<bits/stdc++.h>#define met(a) memset(a,0,sizeof(a))#define fup(i,a,n,b) for(int i=a;i<n;i+=b)#define fow(j,a,n,b) for(int j=a;j>0;j-=b)#define MOD(x) (x)%modusing namespace std;const int mod = 1e9 + 7;typedef long long ll;string s[120];int main() { int t; scanf(\"%d\", &t); while ( t--) { int n,sub; scanf(\"%d\", &n); int len = 1000; for (int i = 0; i < n; i++) { cin >> s[i]; if (s[i].size() < len)len = s[i].size(), sub = i; } int maxn = 0; for (int i = s[sub].size(); i > 0; i--) { for (int j = 0; j <= s[sub].size(); j++) { string s1, s2; s1 = s[sub].substr(j, i); s2 = s1; reverse(s2.begin(), s2.end()); //反转 int k; for (k = 0; k < n; k++) { if (s[k].find(s1, 0) == -1 && s[k].find(s2, 0) == -1)break; } if (k == n && maxn < s1.size())maxn = s1.size(); } } printf(\"%d\\n\", maxn); } return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"暴力题","slug":"暴力题","permalink":"https://anoyer.cn/tags/暴力题/"},{"name":"HDU","slug":"HDU","permalink":"https://anoyer.cn/tags/HDU/"},{"name":"字符串题解","slug":"字符串题解","permalink":"https://anoyer.cn/tags/字符串题解/"},{"name":"STL","slug":"STL","permalink":"https://anoyer.cn/tags/STL/"}]},{"title":"HDU - 4847 - Wow! Such Doge!(暴力)","slug":"HDU-4847-Wow-Such-Doge-暴力","date":"2018-12-04T13:23:59.000Z","updated":"2019-01-24T04:41:06.354Z","comments":true,"path":"article/HDU-4847-Wow-Such-Doge-暴力.html","link":"","permalink":"https://anoyer.cn/article/HDU-4847-Wow-Such-Doge-暴力.html","excerpt":"","text":"博主链接题目链接题面太长了,就不上题目截图了QAQ题意:在给出的段落里面找出“doge”出现的次数,大小写都可以。(超级大水题,就考你输入恶心恶心人)题解:直接暴力求每一句话出现的doge次数(大小写不限),在一块就可以了输入格式处理—-把类似于“Wow! Such Dooooooooooooooge!!!“这种一行输入看出多个字符串输入,这里看成三个字符串,所以直接用%s存,存一个处理一个代码:1234567891011121314151617181920212223#include<stdio.h>#include<string.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e6+21;const int mod=1e9+7;char s[maxn];int ans=0;int main(){ while(scanf(\"%s\",s)!=EOF){ int len=strlen(s); if(len<3)continue; for(int i=0;i<len-3;i++){ if((s[i]=='d'||s[i]=='D')&&(s[i+1]=='o'||s[i+1]=='O')&&(s[i+2]=='g'||s[i+2]=='G')&&(s[i+3]=='e'||s[i+3]=='E')){ ans++; i+=3; } } } printf(\"%d\\n\",ans); return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"暴力题","slug":"暴力题","permalink":"https://anoyer.cn/tags/暴力题/"},{"name":"HDU","slug":"HDU","permalink":"https://anoyer.cn/tags/HDU/"},{"name":"字符串题解","slug":"字符串题解","permalink":"https://anoyer.cn/tags/字符串题解/"}]},{"title":"HDU - 4513 - 吉哥系列故事――完美队形II (马拉车加判断条件)","slug":"HDU-4513-吉哥系列故事――完美队形II-马拉车加判断条件","date":"2018-12-04T13:20:21.000Z","updated":"2019-01-24T04:40:57.023Z","comments":true,"path":"article/HDU-4513-吉哥系列故事――完美队形II-马拉车加判断条件.html","link":"","permalink":"https://anoyer.cn/article/HDU-4513-吉哥系列故事――完美队形II-马拉车加判断条件.html","excerpt":"","text":"博主链接题目链接题意:在一个长度为n的数组里面找回文串,要求回文串从中间向两边一次递减题解:在manacher过程中添加限制语句保证题目要求即可1234if(s_new[i+p[i]]!=-1111){ //如果前面位置大于当前位置,则不符合跳出 if(s_new[i+p[i]]<=s_new[i+p[i]-2])p[i]++; else break;}1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859#include<stdio.h>#include<iostream>#include<string.h>#include<algorithm>using namespace std;int s[100050];int s_new[100050*2];int p[100050*2];int Init(int len){ s_new[0] = -111; s_new[1] = -1111; int j = 2; for (int i = 0; i < len; i++){ s_new[j++] = s[i]; s_new[j++] = -1111; } s_new[j] = -11; //别忘了哦 return j; //返回s_new的长度}int Manacher(int len){ //取得新字符串长度并完成向s_new的转换 int maxLen = -1; //最长回文长度 int id; int mx = 0; for (int i = 1; i < len; i++){ if (i < mx) p[i] = min(p[2 * id - i], mx - i); //需搞清楚上面那张图含义, mx和2*id-i的含义 else p[i] = 1; while (s_new[i - p[i]] == s_new[i + p[i]]) //不需边界判断,因为左有'$',右有'\\0' { if(s_new[i+p[i]]!=-1111){ //如果前面位置大于当前位置,则不符合跳出 if(s_new[i+p[i]]<=s_new[i+p[i]-2])p[i]++; else break; } p[i]++; } //我们每走一步i,都要和mx比较,我们希望mx尽可能的远,这样才能更有机会执行if (i < mx)这句代码,从而提高效率 if (mx < i + p[i]) { id = i; mx = i + p[i]; } maxLen = max(maxLen, p[i] - 1); } return maxLen;}int main(){ int t; scanf(\"%d\",&t); while (t--){ int n; scanf(\"%d\",&n); for(int i=0;i<n;i++)scanf(\"%d\",&s[i]); int len=Init(n); printf(\"%d\\n\", Manacher(len)); } return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"HDU","slug":"HDU","permalink":"https://anoyer.cn/tags/HDU/"},{"name":"字符串题解","slug":"字符串题解","permalink":"https://anoyer.cn/tags/字符串题解/"},{"name":"Manacher","slug":"Manacher","permalink":"https://anoyer.cn/tags/Manacher/"}]},{"title":"HDU - 4763 -Theme Section(迭代求公共前后缀跑KMP)","slug":"HDU-4763-Theme-Section-迭代求公共前后缀跑KMP","date":"2018-12-04T13:17:14.000Z","updated":"2019-01-24T04:41:02.139Z","comments":true,"path":"article/HDU-4763-Theme-Section-迭代求公共前后缀跑KMP.html","link":"","permalink":"https://anoyer.cn/article/HDU-4763-Theme-Section-迭代求公共前后缀跑KMP.html","excerpt":"","text":"博主链接题目链接题意:给一个字符串,求出字符串的最大的相同前缀后缀,并且满足前缀后缀在字符串中间出现了。题解:可以先对字符串跑KMP求一下Next数组,由next数组定义可以知道,里面存的是当前字符最长前缀和后缀,所以我们只需要从最后一个字符出发,递归寻找每个长度为的Next值的前缀后缀,对于长度为len的前缀,只需要用该前缀起和字符串的除了前缀和后缀的部分匹配就可以了,如果匹配成功,就看是否需要更新答案。代码:12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e6+21;const int mod=1e9+7;char s[maxn];int nex[maxn];int len;void GetNex(){ int j=-1; for(int i=0;s[i];i++){ while(s[i]!=s[j+1]&&j!=-1)j=nex[j]; if(s[i]==s[j+1]&&i!=0)j++; nex[i]=j; }}bool kmp(int l){ int j=-1; for(int i=l;i<len-l;i++){ while(j!=-1&&s[j+1]!=s[i])j=nex[j]; if(s[i]==s[j+1])j++; if(j+1==l)return true; } return false;}int main(){ int t; scanf(\"%d\",&t); while(t--){ scanf(\"%s\",s); len=strlen(s); if(len<3){ puts(\"0\"); continue; } GetNex(); int ans=nex[len-1]; int mx=0; while(ans!=-1){ if(kmp(ans+1)){ mx=max(mx,ans+1); //查找中间是否有这个串 } ans=nex[ans]; } printf(\"%d\\n\",mx); } return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"HDU","slug":"HDU","permalink":"https://anoyer.cn/tags/HDU/"},{"name":"KMP","slug":"KMP","permalink":"https://anoyer.cn/tags/KMP/"},{"name":"字符串题解","slug":"字符串题解","permalink":"https://anoyer.cn/tags/字符串题解/"}]},{"title":"HDU - 3613 - Best Reward(马拉车加暴力)","slug":"HDU-3613-Best-Reward(马拉车加暴力)","date":"2018-12-04T13:14:11.000Z","updated":"2019-01-24T04:40:42.834Z","comments":true,"path":"article/HDU-3613-Best-Reward(马拉车加暴力).html","link":"","permalink":"https://anoyer.cn/article/HDU-3613-Best-Reward(马拉车加暴力).html","excerpt":"","text":"博主链接题目链接题意:字母表的26个字母都有一个价值,给你一个字符串,将该字符串切成两份,对于每一份,如果是回文串,就获得该子串的字母价值之和,否则该子串的价值为0。求出将字符串切成两份后能够获得的最大价值。题解:先用Manacher算法求出以每个字母为中心的回文串的长度,并计算该字符串的前缀价值和。然后枚举切割点,得到两份子串。这样就可以知道每个子串的中心点,然后检查以该子串的中心点作为中心点的回文串的长度,如果长度等于该子串的长度,那么就加上该子串的价值。然后和最优价值比较就行了。1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374#include<stdio.h>#include<bits/stdc++.h>#define met(a) memset(a,0,sizeof(a));using namespace std;typedef long long ll;const int maxn = 500050;char s[maxn];char s_new[maxn * 2];int p[maxn * 2];int sum[maxn];int Init(){ int len = strlen(s); s_new[0] = '$'; s_new[1] = '#'; int j = 2; for (int i = 0; i < len; i++){ s_new[j++] = s[i]; s_new[j++] = '#'; } s_new[j] = '\\0'; //printf(\"%s\\n\",s_new); return j; //返回s_new的长度 }void Manacher(){ int len = Init(); //取得新字符串长度并完成向s_new的转换 //int maxLen = -1; //最长回文长度 int id; int mx = 0; for (int i = 1; i < len; i++){ if (i < mx) p[i] = min(p[2 * id - i], mx - i); //需搞清楚上面那张图含义, mx和2*id-i的含义 else p[i] = 1; while (s_new[i - p[i]] == s_new[i + p[i]]) //不需边界判断,因为左有'$',右有'\\0' p[i]++; //我们每走一步i,都要和mx比较,我们希望mx尽可能的远,这样才能更有机会执行if (i < mx)这句代码,从而提高效率 if (mx < i + p[i]) { id = i; mx = i + p[i]; } //maxLen = max(maxLen, p[i] - 1); // printf(\"%d %d %d\\n\",mx,id,maxLen); } /*for(int i=1;i<=len;i++)printf(\"%d \",p[i]); printf(\"\\n\");*/ return ;}int v[30];int main(){ int t; scanf(\"%d\", &t); while (t--){ memset(p, 0, sizeof(p)); for (int i = 0; i < 26; i++)scanf(\"%d\", &v[i]); scanf(\"%s\", s); sum[0] = v[s[0] - 'a']; for (int i = 1; s[i]; i++){ sum[i] = sum[i - 1] + v[s[i] - 'a']; } Manacher(); int Mx = 0; int len = strlen(s); for (int i = 0; i < len - 1; i++){ int tmp = 0; int num = p[i + 2] - 1; if (num == i + 1)tmp += sum[i]; num = p[i + len + 2] - 1; if (num == len - i - 1)tmp += sum[len - 1] - sum[i]; if (tmp>Mx)Mx = tmp; } printf(\"%d\\n\", Mx); } return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"暴力题","slug":"暴力题","permalink":"https://anoyer.cn/tags/暴力题/"},{"name":"HDU","slug":"HDU","permalink":"https://anoyer.cn/tags/HDU/"},{"name":"字符串题解","slug":"字符串题解","permalink":"https://anoyer.cn/tags/字符串题解/"},{"name":"Manacher","slug":"Manacher","permalink":"https://anoyer.cn/tags/Manacher/"}]},{"title":"HDU - 3294 - Girls research(裸马拉车)","slug":"HDU-3294-Girls-research-裸马拉车","date":"2018-12-03T14:13:55.000Z","updated":"2019-01-24T04:40:35.215Z","comments":true,"path":"article/HDU-3294-Girls-research-裸马拉车.html","link":"","permalink":"https://anoyer.cn/article/HDU-3294-Girls-research-裸马拉车.html","excerpt":"","text":"博主CSDN题目链接题意:通过第一个字符与a的关系翻译字符串,输出最长回文串和首尾下标,不存在则输出No solution!题解:用manachar求出最长回文串中心和半径,因为变换后的串各字符下标改变了,所以输出原首尾下标要公式倒推输出字符时要跳过插入的符号。如果你没有马拉车板子,或者说你不会马拉车,请见Manacher最长回文串算法代码:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172#include<stdio.h>#include<algorithm>#include<cstring>#include<iostream>#define met(a) memset(a,0,sizeof(a));using namespace std;typedef long long ll;const int maxn = 200050;char s[maxn];char s_new[maxn * 2];int p[maxn * 2];int iid = 0;int Init(){ int len = strlen(s); s_new[0] = '$'; s_new[1] = '#'; int j = 2; for (int i = 0; i < len; i++){ s_new[j++] = s[i]; s_new[j++] = '#'; } s_new[j] = '\\0'; //printf(\"%s\\n\",s_new); return j; //返回s_new的长度 }int Manacher(){ int len = Init(); //取得新字符串长度并完成向s_new的转换 int maxLen = -1; //最长回文长度 int id; int mx = 0; for (int i = 1; i < len; i++){ if (i < mx) p[i] = min(p[2 * id - i], mx - i); //需搞清楚上面那张图含义, mx和2*id-i的含义 else p[i] = 1; while (s_new[i - p[i]] == s_new[i + p[i]]) //不需边界判断,因为左有'$',右有'\\0' p[i]++; //我们每走一步i,都要和mx比较,我们希望mx尽可能的远,这样才能更有机会执行if (i < mx)这句代码,从而提高效率 if (mx < i + p[i]) { id = i; mx = i + p[i]; } if (p[i] - 1>maxLen){ maxLen = p[i] - 1; iid = i; } // printf(\"%d %d %d\\n\",mx,id,maxLen); } /*for(int i=1;i<=len;i++)printf(\"%d \",p[i]); printf(\"\\n\");*/ return maxLen;}int main(){ char ch ; while (scanf(\"%c%s\",&ch,s)!=EOF){ getchar(); //memset(p, 0, sizeof(p)); int k = ch - 'a'; for (int i = 0; s[i]; i++){ s[i] -= k; if (s[i] < 'a')s[i] += 'z' - 'a' + 1; } int mx = Manacher(); if (mx == 1)printf(\"No solution!\\n\"); else{ printf(\"%d %d\\n\", (iid - mx + 1)/2-1 , (iid + mx - 1)/2-1 ); for (int i = (iid - mx + 1)/2-1; i <= (iid + mx - 1)/2-1; i++)printf(\"%c\", s[i]); puts(\"\"); } } return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"HDU","slug":"HDU","permalink":"https://anoyer.cn/tags/HDU/"},{"name":"字符串题解","slug":"字符串题解","permalink":"https://anoyer.cn/tags/字符串题解/"},{"name":"Manacher","slug":"Manacher","permalink":"https://anoyer.cn/tags/Manacher/"}]},{"title":"HDU - 3068 - 最长回文(裸马拉车)","slug":"HDU-3068-最长回文-裸马拉车","date":"2018-12-03T14:08:07.000Z","updated":"2019-01-24T04:40:31.255Z","comments":true,"path":"article/HDU-3068-最长回文-裸马拉车.html","link":"","permalink":"https://anoyer.cn/article/HDU-3068-最长回文-裸马拉车.html","excerpt":"","text":"博主CSDN题目链接题意:给出一个只由小写英文字符a,b,c…y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等题解:裸的马拉车(Manacher)算法,直接上板子就够了。如果你没有马拉车板子,或者说你不会马拉车,请见Manacher最长回文串算法代码:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657#include<stdio.h>#include<algorithm>#include<cstring>#define met(a) memset(a,0,sizeof(a));using namespace std;typedef long long ll;const int maxn = 110050;char s[maxn];char s_new[maxn * 2];int p[maxn * 2];int Init(){ int len = strlen(s); s_new[0] = '$'; s_new[1] = '#'; int j = 2; for (int i = 0; i < len; i++){ s_new[j++] = s[i]; s_new[j++] = '#'; } s_new[j] = '\\0'; //printf(\"%s\\n\",s_new); return j; //返回s_new的长度 }int Manacher(){ int len = Init(); //取得新字符串长度并完成向s_new的转换 int maxLen = -1; //最长回文长度 int id; int mx = 0; for (int i = 1; i < len; i++){ if (i < mx) p[i] = min(p[2 * id - i], mx - i); //需搞清楚上面那张图含义, mx和2*id-i的含义 else p[i] = 1; while (s_new[i - p[i]] == s_new[i + p[i]]) //不需边界判断,因为左有'$',右有'\\0' p[i]++; //我们每走一步i,都要和mx比较,我们希望mx尽可能的远,这样才能更有机会执行if (i < mx)这句代码,从而提高效率 if (mx < i + p[i]) { id = i; mx = i + p[i]; } maxLen = max(maxLen, p[i] - 1); // printf(\"%d %d %d\\n\",mx,id,maxLen); } /*for(int i=1;i<=len;i++)printf(\"%d \",p[i]); printf(\"\\n\");*/ return maxLen;}int main(){ while (scanf(\"%s\", s)!=EOF){ getchar(); getchar(); memset(p, 0, sizeof(p)); if (s[0] == 'E'&&s[1] == 'N'&&s[2] == 'D')break; printf(\"%d\\n\",Manacher()); } return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"HDU","slug":"HDU","permalink":"https://anoyer.cn/tags/HDU/"},{"name":"字符串题解","slug":"字符串题解","permalink":"https://anoyer.cn/tags/字符串题解/"},{"name":"Manacher","slug":"Manacher","permalink":"https://anoyer.cn/tags/Manacher/"}]},{"title":"HDU - 2609 - How many (最小表示法+set除重)","slug":"HDU-2609-How-many-(最小表示法-set除重)","date":"2018-12-03T14:02:12.000Z","updated":"2019-01-24T04:40:26.635Z","comments":true,"path":"article/HDU-2609-How-many-(最小表示法-set除重).html","link":"","permalink":"https://anoyer.cn/article/HDU-2609-How-many-(最小表示法-set除重).html","excerpt":"","text":"博主CSDN题目链接题意:有n个环形字符串,一个环形字符串移动会形成不能的字符串,我们把它们看作同一串字符串,求有多少个不同的字符串题解:用最小表示法把每个串的最小字典序找出来, ==(如果两个循环串相等则他们的最小字典序也一定相等)==,set带有除重功能,因为set具有除重功能所以用set来存每个串求出的最小字典序代码:12345678910111213141516171819202122232425262728293031323334353637#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e4+20;const int mod=1e9+7;string s;int len;int GetMin(){ int i=0,j=1,k=0; while(i<len&&j<len&&k<len){ int t=s[(i+k)%len]-s[(j+k)%len]; if(t==0)k++; else{ if(t>0)i=i+k+1; else j=j+k+1; if(i==j)j++; k=0; } } return min(i,j);}int main(){ int n; while(scanf(\"%d\",&n)!=EOF){ set<string>sub; for(int i=0;i<n;i++){ cin>>s; len=s.size(); s+=s; int l=GetMin(); sub.insert(s.substr(l,len)); } printf(\"%d\\n\",sub.size()); } return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"HDU","slug":"HDU","permalink":"https://anoyer.cn/tags/HDU/"},{"name":"字符串题解","slug":"字符串题解","permalink":"https://anoyer.cn/tags/字符串题解/"},{"name":"最大最小表示法","slug":"最大最小表示法","permalink":"https://anoyer.cn/tags/最大最小表示法/"}]},{"title":"HDU - 2087-减花布条(裸KMP模板)","slug":"HDU-2087-减花布条-裸KMP模板","date":"2018-12-03T13:59:03.000Z","updated":"2019-01-24T04:40:13.360Z","comments":true,"path":"article/HDU-2087-减花布条-裸KMP模板.html","link":"","permalink":"https://anoyer.cn/article/HDU-2087-减花布条-裸KMP模板.html","excerpt":"","text":"博主CSDN题目链接题意:中文题面,题意也说得非常清楚了,给一个文本串,求文本串中有多少个不重复的模式串题解:kmp标准做法,甚至基本没有变动。 判断的时候,每当完整的匹配一次之后令j=0,ans++,即模式串的下标从0开始,匹配数量加1代码:1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556#include<iostream>#include<algorithm>#include<cstdio>#include<cmath>#include<cstring>#include<string>#include<cstdlib>#include<queue>#include<stack>#include<map>#include<set>#include<vector>using namespace std;const int maxn=1000030;int next1[10030];char s[maxn];char p[10030];int cnt=0;void prefix_next(){ next1[0]=0; next1[1]=0; int j; for(int i=1;p[i]!='\\0';i++){ j = next1[i]; while(j && p[j] != p[i]) j = next1[j]; next1[i+1] = p[j] == p[i] ? j + 1: 0; } return;}void kmp(){ int j=0,m=strlen(p),n=strlen(s); for(int i=0;s[i]!='\\0';i++){ while(j && p[j] != s[i]) j = next1[j]; if(p[j] == s[i]) j ++; if(j == m) { cnt++; if(i+m<n) j=0; else return; } } return;}int main(){/* #ifdef LOCAL freopen(\"C:/Users/Administrator/Desktop/input.txt\",\"r\",stdin); #endif*/ while(~scanf(\"%s\",s),strcmp(s,\"#\")){ cnt=0; cin>>p; prefix_next(); kmp(); cout<<cnt<<endl; }}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"HDU","slug":"HDU","permalink":"https://anoyer.cn/tags/HDU/"},{"name":"KMP","slug":"KMP","permalink":"https://anoyer.cn/tags/KMP/"},{"name":"字符串题解","slug":"字符串题解","permalink":"https://anoyer.cn/tags/字符串题解/"}]},{"title":"HDU-1711-Number Sequence(数组跑KMP)","slug":"HDU-1711-Number-Sequence-数组跑KMP","date":"2018-12-03T13:55:24.000Z","updated":"2019-01-24T04:40:01.435Z","comments":true,"path":"article/HDU-1711-Number-Sequence-数组跑KMP.html","link":"","permalink":"https://anoyer.cn/article/HDU-1711-Number-Sequence-数组跑KMP.html","excerpt":"","text":"博主CSDN题目链接题意:给你两个数组的所有元素,让你对它们进行匹配,当位置为多少时候它们能完全匹配。题解:直接跑KMP就可以了,唯一注意的…..emmm….应该不用注意吧,也就原先是字符串,现在把字符串换成数组超级大水题代码:123456789101112131415161718192021222324252627282930313233343536373839404142434445#include<stdio.h>#include<bits/stdc++.h> using namespace std;int s[1000100],t[11000];int nex[1000100];//nex数组大小和短串一致int ans,n,m;inline void get_nex(){ int j=-1;//影响next[0] for (int i=0;i<m;i++){ while(t[i]!=t[j+1] && j!=-1) j=nex[j]; if (t[i]==t[j+1] && i!=0) j++; nex[i]=j; }}inline void kmp(){ int j=-1; for (int i=0;i<n;i++){ while(s[i]!=t[j+1] && j!=-1) j=nex[j]; if (s[i]==t[j+1]) j++; if (j==m-1){ ans++; printf(\"%d\\n\",i-j+1); break; } }}int main(){ int tt; scanf(\"%d\",&tt); while(tt--){ ans=0; scanf(\"%d%d\",&n,&m); for(int i=0;i<n;i++)scanf(\"%d\",&s[i]); for(int i=0;i<m;i++)scanf(\"%d\",&t[i]); get_nex(); kmp(); if(ans==0)printf(\"-1\\n\"); }}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"HDU","slug":"HDU","permalink":"https://anoyer.cn/tags/HDU/"},{"name":"KMP","slug":"KMP","permalink":"https://anoyer.cn/tags/KMP/"},{"name":"字符串题解","slug":"字符串题解","permalink":"https://anoyer.cn/tags/字符串题解/"}]},{"title":"HDU-1841-Find the Shortest Common Superstring(kmp)","slug":"HDU-1841-Find-the-Shortest-Common-Superstring(kmp)","date":"2018-12-03T13:52:21.000Z","updated":"2019-01-24T04:40:06.986Z","comments":true,"path":"article/HDU-1841-Find-the-Shortest-Common-Superstring(kmp).html","link":"","permalink":"https://anoyer.cn/article/HDU-1841-Find-the-Shortest-Common-Superstring(kmp).html","excerpt":"","text":"博主CSDN题目链接题意:给出两个串,用这两个串组成一个新串,使新串包含这两个串,问这个新串的长度最小是多少;题解:显然,对于两个串A,B;A如果是B的子串或者B如果是A的子串的话,直接输出那个母串的长度即可,如果没有这种关系,那么看一个串的后缀是否是另一个串的前缀,如果某个串的后缀与另一个串的前缀的公共部分最长,则答案=A.length+B.length-公共长度,所以可以直接用kmp去做。(kmp匹配最后j值为模式串前缀和主串后缀最长公共长度)代码:12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970#include<stdio.h>#include<algorithm>#include<iostream>#include<cstring> using namespace std; const int N = 1000100;char a[3][2*N];int fail[2*N];inline int max(int a, int b){ return (a > b) ? a : b;}int kmp(int &i, int &j, char* str, char* pat){ int k; memset(fail, -1, sizeof(fail)); for (i = 1; pat[i]; ++i){ for (k = fail[i - 1]; k >= 0 && pat[i] != pat[k + 1]; k = fail[k]); if (pat[k + 1] == pat[i]){ fail[i] = k + 1; } } i = j = 0; while (str[i] && pat[j]){ if (pat[j] == str[i]){ i++; j++; } else if (j == 0){ i++; } else{ j = fail[j - 1] + 1; } } //printf(\"%d %d\\n\",i,j); if (pat[j]){ return -1; } else{ return i - j; }}int main(int argc, const char * argv[]){ int T; scanf(\"%d\", &T); while (T--){ int i, j, l1 = 0, l2 = 0; cin >> a[0] >> a[1]; int len1 = (int)strlen(a[0]), len2 = (int)strlen(a[1]), val; val = kmp(i, j, a[1], a[0]); if (val != -1){ l1 = len1; } else{ if (i == len2 && j - 1 >= 0 && a[1][len2 - 1] == a[0][j - 1]){ l1 = j; } } val = kmp(i, j, a[0], a[1]); if (val != -1){ l2 = len2; } else{ if (i == len1 && j - 1 >= 0 && a[0][len1 - 1] == a[1][j - 1]){ l2 = j; } } printf(\"%d\\n\", len1 + len2 - max(l1, l2)); } return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"HDU","slug":"HDU","permalink":"https://anoyer.cn/tags/HDU/"},{"name":"KMP","slug":"KMP","permalink":"https://anoyer.cn/tags/KMP/"},{"name":"字符串题解","slug":"字符串题解","permalink":"https://anoyer.cn/tags/字符串题解/"}]},{"title":"Python入门教程","slug":"Python入门教程","date":"2018-12-02T14:40:55.000Z","updated":"2019-01-24T04:42:25.074Z","comments":true,"path":"article/Python入门教程.html","link":"","permalink":"https://anoyer.cn/article/Python入门教程.html","excerpt":"","text":"基本语法1.注释———# 标注文本2.数字整数,不区分long和int进制0xa (16进制的10),0o10(8进制的10),0b10(2进制的10)bool,2个值True,False浮点数1.2,3.1415.-0.12,1.46e9等价于1.46*10^9复数,1+2j3.字符串使用‘ “单双引号引用字符的序列‘ ’ ‘ ” “ ” 单双三引号,可以跨行,可以在其中自由的使用单双引号1234567print(''' welcome 'to' python''') #输出 welcome 'to' pythonprint(''' welcome 'to' 1\\ #输出 welcome 'to' 2\\ # 1233\\ # 'python''python' ''')在字符串前面加上r或者R前缀,表示该字符串不做特殊处理(比如字符串中含有\\)python为强类型语言,所以不允许’a‘+1字符串可以直接连接1print('abc'+'efg') #打印出abcefg4.转义序列\\\\ \\t \\r \\n \\‘ \\“前缀r,把里面的所有的字符当普通字符对待5.缩进未使用C等语言的花括号,而是采用缩进的方式表示层次关系约定使用4个空格缩进6.续行在行尾使用 \\如果使用各种括号,认为括号内的是一个整体,内部跨行不用 \\7.标识符一个名字,用来指代一个值只能字母,下划线和数字只能以字母或下划线开头不能是python的关键字,例如def,class就不能作为标识符python是大小写敏感的约定:不允许使用中文不允许使用歧义单词,例如class_在python中不要随便使用下划线开头的标识符8.常量一旦赋值就不能改变值的标识符python中无法定义常量9.字面常量一个单独的量,例如12,“abc”,’2341356514.03e-9’10.变量赋值后,可以改变值的标识符运算符Operator1.算数运算符+ - * / % ****表示次方12print(2**3) #输出 8print(4**0.5) #输出 2.0自然除/结果是浮点数,整除//。注:2.x中对于整数都是/和//都是整除2.位运算符& | ~ ^ << >>& 按位与| 按位或~ 按反码补码取反(反出来会比真实相反数小一)原码5=> 0b101, 1=>0b1 ,-1=> -0b1, bin(-1) #可以获取数字原码1bin(-1) #获得-0b1;反码正数将原码按位取反;负数符号位不变其余按位取反补码正数的补码是其本身;负数符合位不变其余按位取反后-1^ 按位异或<< 向左的位移1print(1<<2) #输出4>> 向右的位移1print(4>>1) #输出 2常用方式:乘除2的倍数,32//4相当于32>>212,0xc,0o14,0b1100~12等于-133.比较运算符== != > < >= <=返回一个bool值1<’1’ 1==’1’4.逻辑运算符与或非 and or not短路运算符and 如果第一个表达式位False,后面的就没有必要计算了,这个逻辑表达式一定Falseor 如果第一个表达式True,后面没有必要计算了,这个逻辑表达式一定是True5.赋值运算符a=min(3,5)+= -= == /= %=x=y=z=106.成员运算符in ,not in7.身份运算符is,not is8.运算优先级(由高到底)算数运算符 > 位运算符 > 身份运算符 > 成员运算符 > 逻辑运算符表达式 Expression1.由数字,符号,括号,变量等的组合算数表达式逻辑表达式赋值表达式Python,赋值及定义,如果一个变量了已经定义,赋值相当于重新定义程序控制顺序按照先后顺序一条一条执行例如,先洗手,再吃饭,再洗碗分支根据不同的情况判断,条件满足执行某条件下的语句例如,先洗手,如果饭没做好,玩游戏,如果饭做好了,就吃饭,如果饭都没做,叫外卖循环条件满足就反复执行,不满足就不执行或者不再执行例如:先洗手,看饭好了没有,没有好,一会来看一次是否好了,一会儿来看一次,直到饭好了,才可以吃饭。这里循环的条件就是饭好了没,饭没好,就循环的来看饭好了没有。单分支结构1.if语句 if 表达式:代码块(必须由4个空格,不允许使用缩进) 表达式必须是一个bool类型,这个地方有一个隐式转换bool(表达式)12if 1<2: print('1 less than 2')2.代码块类似于if语句的冒号后面的就是一个代码块if, for , def ,class 等真值表 bool(表达式)对应的隐式转换对象/常量值“”假“string”真0假>=1真<=-1真()空原组假[]空列表假{}空字典假None假多分支结构if…elif…else语句123456789if 表达式1: 代码块1elif 表达式2: 代码块2elif 表达式3: 代码块3……else: 代码块1234567891011 a=4 if a<1: print('S') elif a<3: print('AS') elif a<4: print('B') else: print('sss')#输出:sss2.分支嵌套举例1234567891011score=80if score<0: print(\"wrong\")else: if score==0: print('egg') elif score<=100: print('right') else: print('too big')#输出:right循环——while语句语句123while 表达式: 代码块#当条件满足表达式为true,进入循环题,执行代码块举例123456789101112131415flag=10while flag: print(flag) flag-=1#输出:10987654321循环——for语句*语法123for element in iteratable: block#当可迭代对象中有对象可以迭代,进入循环体,执行代码块range函数举例:打印1~1012345678910111213for i in range(10): //从0开始迭代到9,每次i++; print(i+1)#输出:1234567891012345678#打印0~9的偶数for i in range(2,10,2): //从2开始迭代到9,每次i+=2; print(i)#输出:2468循环continue语句中断当前循环的当次执行,继续下一次循环举例:计算10以内的偶数(for循环)12345678910for i in range(10): if i%2: continue print(i)#输出02468循环break语句终止当前循环举例:计算1000以内的被7整除的前20个数(for循环)123456789101112131415161718192021222324252627count=0;for i in range(0,1000,7): print(i) count+=1 if(count>=20): break#输出:0714212835424956637077849198105112119126133循环else子句语法12345678while condition: blockelse: blockfor element in iteratable: blockelse: block如果循环正常的执行结束,就执行else子句;如果使用break终止,else子句不会执行Python输入输出1.输入input()1234567num=intput('请输入一个数') #输入一个数回车结束print(num) #输入1234 输出1234#在有的版本python中存在一下问题num=input() #输入的是一个字符串print num #如果输入1234 打印的是一个字符串’1234‘num=int(input()) #输入的是一个整数print num #打印这个整数print1234print a #打印变量aprint(a) #打印aprint(a,b) #打印(a,b)print a,b #打印a,b未完待续","categories":[{"name":"Pyhton","slug":"Pyhton","permalink":"https://anoyer.cn/categories/Pyhton/"}],"tags":[{"name":"Python入门","slug":"Python入门","permalink":"https://anoyer.cn/tags/Python入门/"}]},{"title":"Material Plus主题安装和使用文档","slug":"Material-Plus主题安装和使用文档","date":"2018-12-02T07:56:14.000Z","updated":"2018-12-05T05:37:11.935Z","comments":true,"path":"article/Material-Plus主题安装和使用文档.html","link":"","permalink":"https://anoyer.cn/article/Material-Plus主题安装和使用文档.html","excerpt":"这是一篇加密文档,请输入密码去阅读。","text":"这是一篇加密文档,请输入密码去阅读。 Incorrect Password! No content to display! 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","categories":[{"name":"Hexo","slug":"Hexo","permalink":"https://anoyer.cn/categories/Hexo/"}],"tags":[{"name":"Hexo","slug":"Hexo","permalink":"https://anoyer.cn/tags/Hexo/"},{"name":"Material Plus","slug":"Material-Plus","permalink":"https://anoyer.cn/tags/Material-Plus/"}]},{"title":"记一次Hexo博客更新","slug":"记一次Hexo博客更新","date":"2018-12-02T07:22:22.000Z","updated":"2019-01-24T04:47:00.138Z","comments":true,"path":"article/记一次Hexo博客更新.html","link":"","permalink":"https://anoyer.cn/article/记一次Hexo博客更新.html","excerpt":"","text":"这次更新成功将博客从Next主题换到了Material Plus…….前言:先上一个更新前及更新后预览图对比更新前:更新后:是不是灰常好看捏^_^开工:第一步:删库备份首先,把E盘Blog仓库复制一份到D盘(方便以后两主题来回切换),然后删库你没听错,直接把E盘Blog删了,然后init一个新Blog仓库。第二步:下载主题及覆盖下载主题后把Blog里的themes和source,scaffolds覆盖了第三步:进行主题配置:因为版权问题,详细步骤请看—Material Plus主题安装和使用文档(还是别看了,加密的,哈哈哈)完工:本蒟蒻不懂前端,以上代码大部分都是去 Inspect Element 然后复制粘贴再改一下的成果。。。还请各位大佬指正!好了,本文结束,下篇文章再见~ ✿✿ヽ(°▽°)ノ✿","categories":[{"name":"闲记","slug":"闲记","permalink":"https://anoyer.cn/categories/闲记/"}],"tags":[{"name":"Hexo","slug":"Hexo","permalink":"https://anoyer.cn/tags/Hexo/"}]},{"title":"POJ-3261-Milk Patterns(后缀数组)","slug":"POJ-3261-Milk-Patterns-后缀数组","date":"2018-11-30T00:35:06.000Z","updated":"2019-01-24T04:42:14.948Z","comments":true,"path":"article/POJ-3261-Milk-Patterns-后缀数组.html","link":"","permalink":"https://anoyer.cn/article/POJ-3261-Milk-Patterns-后缀数组.html","excerpt":"","text":"博主CSDN题目链接题意:给定一个字符串S,求至少出现k次的最长重复子串,这k个子串可以重叠。题解:后缀数组。先二分答案,然后将后缀分成若干组。这里要判断的是有没有一个组的后缀个数不小于k。如果有,那么存在k个相同的子串满足条件,否则不存在。。代码:12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 /* 题意:找出出现k次的可重叠的最长子串的长度 这都是套路题了,二分长度L,按照height值分组,在同一组内的组数如果大于K,则成立。 */#include <cstdio>#include <cstring>#include <algorithm>#include<iostream>using namespace std;const int MAXN = 100005;char ch[MAXN], All[MAXN];int SA[MAXN], rank[MAXN], Height[MAXN], tax[MAXN], tp[MAXN], a[MAXN], n, m;char str[MAXN];int k,cnt;//rank[i] 第i个后缀的排名; SA[i] 排名为i的后缀位置; Height[i] 排名为i的后缀与排名为(i-1)的后缀的LCP//tax[i] 计数排序辅助数组; tp[i] rank的辅助数组(计数排序中的第二关键字),与SA意义一样。//a为原串void RSort() { //rank第一关键字,tp第二关键字。 for (int i = 0; i <= m; i ++) tax[i] = 0; for (int i = 1; i <= n; i ++) tax[rank[tp[i]]] ++; for (int i = 1; i <= m; i ++) tax[i] += tax[i-1]; for (int i = n; i >= 1; i --) SA[tax[rank[tp[i]]] --] = tp[i]; //确保满足第一关键字的同时,再满足第二关键字的要求} //计数排序,把新的二元组排序。int cmp(int *f, int x, int y, int w) { return f[x] == f[y] && f[x + w] == f[y + w]; }//通过二元组两个下标的比较,确定两个子串是否相同void Suffix() { //SA for (int i = 1; i <= n; i ++) rank[i] = a[i], tp[i] = i; m = 127 ,RSort(); //一开始是以单个字符为单位,所以(m = 127) for (int w = 1, p = 1, i; p < n; w += w, m = p) { //把子串长度翻倍,更新rank //w 当前一个子串的长度; m 当前离散后的排名种类数 //当前的tp(第二关键字)可直接由上一次的SA的得到 for (p = 0, i = n - w + 1; i <= n; i ++) tp[++ p] = i; //长度越界,第二关键字为0 for (i = 1; i <= n; i ++) if (SA[i] > w) tp[++ p] = SA[i] - w; //更新SA值,并用tp暂时存下上一轮的rank(用于cmp比较) RSort(), swap(rank, tp), rank[SA[1]] = p = 1; //用已经完成的SA来更新与它互逆的rank,并离散rank for (i = 2; i <= n; i ++) rank[SA[i]] = cmp(tp, SA[i], SA[i - 1], w) ? p : ++ p; } //离散:把相等的字符串的rank设为相同。 //LCP int j, k = 0; for(int i = 1; i <= n; Height[rank[i ++]] = k) for( k = k ? k - 1 : k, j = SA[rank[i] - 1]; a[i + k] == a[j + k]; ++ k); //这个知道原理后就比较好理解程序}bool check(int mid){ cnt=1; for(int i=1;i<=n;i++){ if(Height[i]<mid)cnt=1; else cnt++; if(cnt>=k)return 1; } return 0;}void Init() { for (int i=1; i <=n; i ++) scanf(\"%d\",&a[i]);}int main() { #ifdef LOCAL freopen(\"C:/Users/Administrator/Desktop/input.txt\", \"r\", stdin); #endif scanf(\"%d%d\",&n,&k); Init(); Suffix(); //for(int i=1;i<=n;i++)cout<<SA[i]<<endl; for(int i=1;i<=n;i++)cout<<Height[i]<<\" \"; cout<<endl; int res=0; int l=1,r=n; while(l<=r){ int mid=(l+r)>>1; if(check(mid)){ l=mid+1; res=max(res,mid); } else r=mid-1; } printf(\"%d\\n\",res);}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"字符串题解","slug":"字符串题解","permalink":"https://anoyer.cn/tags/字符串题解/"},{"name":"POJ","slug":"POJ","permalink":"https://anoyer.cn/tags/POJ/"},{"name":"后缀数组","slug":"后缀数组","permalink":"https://anoyer.cn/tags/后缀数组/"}]},{"title":"HDU-4333-Revolving Digits(扩展KMP)","slug":"HDU-4333-Revolving-Digits-扩展KMP","date":"2018-11-30T00:34:52.000Z","updated":"2019-01-24T04:40:53.589Z","comments":true,"path":"article/HDU-4333-Revolving-Digits-扩展KMP.html","link":"","permalink":"https://anoyer.cn/article/HDU-4333-Revolving-Digits-扩展KMP.html","excerpt":"","text":"CSDN题目链接题意:给你一个字符串,你可以将该字符串的任意长度后缀截取下来然后接到最前面,让你统计所有新串中有多少种字典序小于、等于、大于原串。题解:首先我们将原串扩展成两倍,算一遍扩展KMP(自匹配),时间复杂度O(n)。这样一来,我们就得到了eKMP[i],eKMP[i]代表s[i…len-1]与s的最长公共子串。为了避免重复子串重复计数,我们先求出s的最小循环节:然后我们只需统计最小循环节以内的字符就可。当eKMP[i]>=len时,显然是原串,E++;否则我们只需比较一位就可判断大小,即:比较s[i+eKMP[i]]和s[eKMP[i]]的大小。为什么只需比较一位?因为s[0…eKMP[i]-1]和s[i…i+eKMP[i]-1]是相同的,只需判断第一个不相同的位置就可代码:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960#include<stdio.h>#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int maxn=100010;//字符串长度最大值int next1[maxn*2],ex[maxn];//ex数组即为extend数组char s[maxn*2],s2[maxn];int n;//预处理计算next数组void getnext(){ int i=0,j,po,len=strlen(s); next1[0]=len;//初始化next[0] while(s[i]==s[i+1]&&s[i+1])//计算next[1] i++; next1[1]=i; po=1;//初始化po的位置 for(i=2;i<len;i++){ if(next1[i-po]+i<=next1[po]+po-1)//第一种情况,可以直接得到next[i]的值 next1[i]=next1[i-po]; else //第二种情况,要继续匹配才能得到next[i]的值 { j=next1[po]+po-i; if(j<0)j=0;//如果i>po+next[po],则要从头开始匹配 while(i+j<len&&s[j]==s[j+i])//计算next[i] j++; next1[i]=j; po=i;//更新po的位置 } }}void work(){ int ret1,ret2,ret3; ret1=ret2=ret3=0; //for(int i=0;i<2*n;i++)printf(\"%d \",next1[i]); //cout<<endl; for(int i=0;i<n;i++){ if(i!=0&&next1[i]>=n)break; if(next1[i]<n){ if(s[i+next1[i]]<s[next1[i]])ret1++; else ret3++; }else ret2++; } printf(\"%d %d %d\\n\",ret1,ret2,ret3);}int main(){ int t,cas=0; scanf(\"%d\",&t); while(t--){ scanf(\"%s\",s); n=strlen(s); printf(\"Case %d: \",++cas); for(int i=0;i<n;i++){ s[n+i]=s[i]; }s[2*n]='\\0'; //printf(\"\\n%s\",s); getnext(); work(); }}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"HDU","slug":"HDU","permalink":"https://anoyer.cn/tags/HDU/"},{"name":"字符串题解","slug":"字符串题解","permalink":"https://anoyer.cn/tags/字符串题解/"},{"name":"扩展KMP","slug":"扩展KMP","permalink":"https://anoyer.cn/tags/扩展KMP/"}]},{"title":"Anoyer训练计划","slug":"Anoyer训练计划","date":"2018-11-30T00:34:41.000Z","updated":"2019-01-24T04:39:10.000Z","comments":true,"path":"article/Anoyer训练计划.html","link":"","permalink":"https://anoyer.cn/article/Anoyer训练计划.html","excerpt":"","text":"Anoyer JB训练规划前期:18年12月-19年2月低完成算法专题训练一阶段+一些专题散题:kuangbin-字符串所有专题kuangbin-数论所有专题各OJ专题散题+cf比赛该阶段必须掌握字符串和数论所有考点算法及其各种运用(这也是刷专题的意义所在),除去一些特难算法稀有神兽级别的算法(脑子不够,学意义也不大)中期:19年3月-省赛前完成计算几何 (重心) 和数据结构算法学习及专题训练++一些专题散题:kuangbin-计算几何所有专题kuangbin-数据结构所有专题各OJ专题散题+cf比赛该阶段结束时,必须掌握字符串,数论,计算机几何,数据结构所有考点算法及其各种运用(这也是刷专题的意义所在,粘贴复制上文的QAQ),除去一些特难算法稀有神兽级别的算法(脑子不够,学意义也不大)后期:省赛结束后-暑假前开始补cf以前的题,锻炼思维及出题速度 学习较为单一的一个阶段尽可能多的补cf以前的题,对于补的每一场比赛,尽可能的把这一场的题都补完,这样才是补题意义所在该阶段意义在于训练思维能力,能快速的对于一道题目给出解题思路,这也是我半年训练及两次现场赛的经验CF很重要,解题思维比算法更重要冲刺期:7月-8月准备参加多校训练或者时参加夏令营个人意向时参加夏令营,提升会很大也很快进行高压训练,每场比赛都可以看出本赛季的希望,且对知识巩固利用并实战同时利用空闲时间进行个人模板整理cf补题该阶段也是对知识点磨合对算法巩固脑子实战,也是队伍快速磨合阶段网络赛阶段:9月打6场网络赛,拿取名额。在冲刺期应该会有一场CCPC网络赛。目标打满该赛季的ICPC及一场CCPC(估计得经济倒退一阵子)网络赛cf补题好好打网络赛拿名额网络赛后备赛阶段,日常刷题训练cf补题专题复习平复赛前心态,以最好心态及状态参赛Anoyer训练规划讲完!!!","categories":[{"name":"闲记","slug":"闲记","permalink":"https://anoyer.cn/categories/闲记/"}],"tags":[{"name":"生活","slug":"生活","permalink":"https://anoyer.cn/tags/生活/"}]},{"title":"逆元模板","slug":"逆元模板","date":"2018-11-27T05:55:49.000Z","updated":"2019-01-24T04:47:09.543Z","comments":true,"path":"article/逆元模板.html","link":"","permalink":"https://anoyer.cn/article/逆元模板.html","excerpt":"","text":"费马小定理求逆元12345678910111213141516171819202122ll quick_mod(ll a,ll b,ll c) //快速幂计算(a^b)%c{ ll ans = 1; while(b) { if(b&1) //相当于b%2==1 ans = (ans*a)%c; a = (a*a)%c; b>>=1; //相当于b/=2 } return ans;} ll inv(ll b,ll c) //计算b的逆元{ return quick_mod(b,c-2,c);} ll div(ll a,ll b,ll c) //计算(a/b)%c{ return ((a%c)*(inv(b,c)%c))%c;}扩展GCD求逆元12345678910111213void ex_gcd(ll a, ll b, ll &d, ll &x, ll &y){ if (!b) {d = a, x = 1, y = 0;} else{ ex_gcd(b, a % b, d, y, x); y -= x * (a / b); }} ll inv(ll a, ll p){//如果不存在,返回-1 a,p互质 ll d, x, y; ex_gcd(a, p, d, x, y); return d == 1 ? (x % p + p) % p : -1;}递归求逆元当p是个质数的时候有inv(a) = (p - p / a) * inv(p % a) % p,且1的逆元就是112345 ll inv(ll t, ll p) { //求t关于p的逆元,注意:t要小于p,最好传参前先把t%p一下 ,即inv(a%p, p)求a对p的逆元 return t == 1 ? 1 : (p - p / t) * inv(p % t, p) % p;}打表求逆元1234567ll inv[maxn];void Prepare_inv(ll n,ll M){ inv[1]=1; for(ll i=2;i<=n;i++){ inv[i]=(ll)(M-M/i)*inv[M%i]%M; }}","categories":[{"name":"数论模板","slug":"数论模板","permalink":"https://anoyer.cn/categories/数论模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"杜教筛模板","slug":"杜教筛","date":"2018-11-27T05:55:49.000Z","updated":"2019-01-24T04:43:50.512Z","comments":true,"path":"article/杜教筛.html","link":"","permalink":"https://anoyer.cn/article/杜教筛.html","excerpt":"","text":"123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081#include<stdio.h>#include<bits/stdc++.h>#define ll long long int;#define N 2001000#define ni 500000004 //2的逆元using namespace std;const long long int mod=0x3f3f3f3f3f3f3f;inline void read(long long &x) //输入外挂 { x=0; static int p;p=1; static char c;c=getchar(); while(!isdigit(c)){if(c=='-')p=-1;c=getchar();} while(isdigit(c)) {x=(x<<1)+(x<<3)+(c-48);c=getchar();} x*=p;}bool vis[N];int mu[N],sum1[N];long long phi[N],sum2[N];int cnt,prim[N];int e,e1;map<long long ,int>w,w1; //哈希 w用来求phi前缀和 w1用来求miu前缀和 void get(int maxn){ phi[1]=mu[1]=1; for(int i=2;i<=maxn;i++) { if(!vis[i]) { prim[++cnt]=i; mu[i]=-1;phi[i]=i-1; } for(int j=1;j<=cnt&&prim[j]*i<=maxn;j++) { vis[i*prim[j]]=1; if(i%prim[j]==0) { phi[i*prim[j]]=phi[i]*prim[j]; break; } else mu[i*prim[j]]=-mu[i],phi[i*prim[j]]=phi[i]*(prim[j]-1); } } for(int i=1;i<=maxn;i++)sum1[i]=sum1[i-1]+mu[i],sum2[i]=(sum2[i-1]+phi[i])%mod; //打一个maxn的phi前缀和表 和miu前缀和表 }int djsmu(long long x) // 求miu前缀和 { if(x<=2000000)return sum1[x]; if(w.count(x))return w[x]; int ans=1; for(long long l=2,r;l<=x;l=r+1) { r=x/(x/l); ans-=(r-l+1ll)*djsmu(x/l); } return w[x]=ans;}long long djsphi(long long x) //求phi 前缀和 { if(x<=2000000)return sum2[x]; if(w1.count(x))return w1[x]; long long ans=(x %mod* ((x + 1) % mod)) % mod*ni%mod; for(long long l=2,r;l<=x;l=r+1) { r=x/(x/l); //最后一个分块中的数 ans = (ans - ((r - l + 1) % mod*djsphi(x / l)) % mod + mod) % mod; } return w1[x]=ans;}int main(){ long long t; read(t); get(2000000); while(t--){ static long long n; read(n); printf(\"%lld %d\\n\",djsphi(n),djsmu(n)); } return 0;}","categories":[{"name":"数论模板","slug":"数论模板","permalink":"https://anoyer.cn/categories/数论模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"欧拉函数模板","slug":"欧拉函数","date":"2018-11-27T05:55:49.000Z","updated":"2019-01-24T04:43:56.211Z","comments":true,"path":"article/欧拉函数.html","link":"","permalink":"https://anoyer.cn/article/欧拉函数.html","excerpt":"","text":"求一个数的欧拉函数123456789101112ll phi(ll x){ //求1~n与n互质的个数 // phi(1323)=phi(3^3*7^2)=1323*(1-1/3)*(1-1/7) ll i, ans = x; for (i = 2; i*i <= x; i++){ if (x%i == 0) ans = ans - ans / i; while(x%i == 0) x /= i; } if (x > 1) ans = ans - ans / x; return ans;}递推求欧拉函数12345678910111213141516171819ll _phi(ll x) { //递推求欧拉函数 利用了欧拉函数的积性 //如果b质数 a%b!=0 phi(a*b) = phi(a)*b - phi(a)//当b是质数,a%b==0,phi(a*b)=phi(a)*b if (x == 0) return 0; ll res = 1, t = x; for (ll i = 2; i <= (ll)sqrt(1.*x); i++) { if (t%i == 0) { res *= (i - 1); t /= i; while (t%i == 0) { res *= i; t /= i; } } if (t == 1) break; } if (t > 1) { res *= (t - 1); } return res;}递推欧拉函数打表12345678910111213141516171819202122ll phi[maxn]; void init(){ for(int i=1;i<=maxn;i++) phi[i] = i; for (int i = 2; i*i < maxn; i++){ //最大素因子表 if (phi[i] == i){ for (int j = i * i; j < maxn; j += i){ phi[j] = i; } } } phi[1] = 1; for (int i = 2; i < maxn; i++){ if ((i / phi[i]) % phi[i] == 0){ phi[i] = phi[i / phi[i]] * phi[i]; //当b是质数,a%b==0,phi(a*b)=phi(a)*b } else { phi[i] = phi[i / phi[i]] * (phi[i] - 1); //如果b质数 a%b!=0 phi(a*b) = phi(a)*b - phi(a) } }}","categories":[{"name":"数论模板","slug":"数论模板","permalink":"https://anoyer.cn/categories/数论模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"矩阵快速幂模板","slug":"矩阵快速幂","date":"2018-11-27T05:55:49.000Z","updated":"2019-01-24T04:46:29.403Z","comments":true,"path":"article/矩阵快速幂.html","link":"","permalink":"https://anoyer.cn/article/矩阵快速幂.html","excerpt":"","text":"快速幂函数123456789101112ll quick_mod(ll a,ll b,ll c) //快速幂计算(a^b)%c{ ll ans = 1; while(b) { if(b&1) //相当于b%2==1 ans = (ans*a)%c; a = (a*a)%c; b>>=1; //相当于b/=2 } return ans;}矩阵快速幂模版12345678910111213141516171819202122232425262728293031323334353637#include<bits/stdc++.h> using namespace std;int N=7;void Matrix(int (&a)[2][2],int b[2][2]){ int tmp[2][2]={0}; for(int i=0;i<2;++i) for(int j=0;j<2;++j) for(int k=0;k<2;++k) tmp[i][j]=(tmp[i][j]+a[i][k]*b[k][j])%N; for(int i=0;i<2;++i){ for(int j=0;j<2;++j){ a[i][j]=tmp[i][j]; } }}int main(){ int a,b,n; while(scanf(\"%d%d%d\",&a,&b,&n)){ if(a==0&&b==0&&n==0)break; if(n==1){ cout<<1<<endl; continue; } int temp[2][2]={a,b,0,0},cot[2][2]={1,0,0,1}, x[2] = {1, 1}; n-=2; while(n){ if(n&1)Matrix(cot,temp); Matrix(temp,temp); n/=2; } int ans=0; for(int i=0;i<2;i++) ans=(ans+x[i]*cot[0][i])%N; cout<<ans<<endl; }}","categories":[{"name":"数论模板","slug":"数论模板","permalink":"https://anoyer.cn/categories/数论模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"最长循环节模板","slug":"最长循环节","date":"2018-11-27T05:55:49.000Z","updated":"2019-01-24T04:43:46.371Z","comments":true,"path":"article/最长循环节.html","link":"","permalink":"https://anoyer.cn/article/最长循环节.html","excerpt":"","text":"正整数k的倒数1/k,写为10进制的小数如果为无限循环小数,则存在一个循环节,求<=n的数中,倒数循环节长度最长的那个数,假如存在多个最优的答案,输出所有答案中最大的那个数。如果1<=b<a,a没有2或5的质因子,并且a与b互质,那么b/a 的循环节位数恰好等于e 满足min(10^e≡1(moda))),e是正整数。如果1<=b<a,a没有2或5的质因子,并且a与b互质,那么b/a 的循环节位数必整除ϕ(a)。123456789101112131415161718192021222324252627282930#include<stdio.h>#include<bits/stdc++.h>#define ll long long int#define met(a) memset(a,0,sizeof(a))#define fup(i,a,n,b) for(int i=a;i<n;i+=b)#define fow(j,a,n,b) for(int j=a;j>0;j-=b)using namespace std;const int maxn = 1e6 + 7;int main(int argc, char *argv[]) { int n,ans=1,maxx=0; scanf(\"%d\", &n); for (int i = 2; i <= n; i++) { int tmp = i, tmp1 = 1, tmp2 = 0; while (tmp % 2 == 0)tmp /= 2; while (tmp % 5 == 0)tmp /= 5; if (tmp == 1)tmp2 = 0; else { do { tmp1 = tmp1 * 10 % tmp; ++tmp2; } while (tmp1 != 1); } if (tmp2 > maxx) { maxx = tmp2; ans = i; } } printf(\"%d\\n\", ans); return 0;}","categories":[{"name":"数论模板","slug":"数论模板","permalink":"https://anoyer.cn/categories/数论模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"线段树模板","slug":"组合数","date":"2018-11-27T05:55:49.000Z","updated":"2019-01-24T04:46:44.778Z","comments":true,"path":"article/组合数.html","link":"","permalink":"https://anoyer.cn/article/组合数.html","excerpt":"","text":"123456789101112131415161718#include <bits/stdc++.h>using namespace std; int C[1005][1005];int main(){ C[0][0] = 1; for (int i = 1; i <= 1000; i++) { C[i][0] = 1; for (int j = 1; j <= 1000; j++) C[i][j] = C[i - 1][j - 1] + C[i - 1][j]; } cout << C[4][3] << endl; return 0;}","categories":[{"name":"数论模板","slug":"数论模板","permalink":"https://anoyer.cn/categories/数论模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"素数筛+埃筛模板","slug":"素数筛","date":"2018-11-27T05:55:49.000Z","updated":"2019-01-24T04:46:33.438Z","comments":true,"path":"article/素数筛.html","link":"","permalink":"https://anoyer.cn/article/素数筛.html","excerpt":"","text":"普通的素数筛1234567891011121314151617181920212223242526272829#include<stdio.h>#include<cstring>#include<bits/stdc++.h>using namespace std;const int MAX=1e7+7;//求MAX范围内的素数long long su[MAX],cnt;bool isprime[MAX];void prime(){ cnt=1; memset(isprime,1,sizeof(isprime));//初始化认为所有数都为素数 isprime[0]=isprime[1]=0;//0和1不是素数 for(long long i=2;i<=MAX;i++) { if(isprime[i]) su[cnt++]=i;//保存素数i for(long long j=1;j<cnt&&su[j]*i<MAX;j++) { isprime[su[j]*i]=0;//筛掉小于等于i的素数和i的积构成的合数 } }}int main(){ prime(); //for(long long i=1;i<cnt;i++) // printf(\"%d \",su[i]); return 0;}埃筛(线性筛)筛素数123456789101112131415int p[maxn], check[maxn], tot = 0;void prime(){ check[1]=1; check[0]=1; for(int i=2;i<=n;i++) { if(!check[i])p[++tot]=i; for(int j=1;j<=tot&&i*p[j]<=n;j++) { check[i*p[j]]=1; if(!(i%p[j]))break;//*****关键 } }}","categories":[{"name":"数论模板","slug":"数论模板","permalink":"https://anoyer.cn/categories/数论模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"莫比乌斯函数打表模板","slug":"莫比乌斯表","date":"2018-11-27T05:55:49.000Z","updated":"2019-01-24T04:46:49.954Z","comments":true,"path":"article/莫比乌斯表.html","link":"","permalink":"https://anoyer.cn/article/莫比乌斯表.html","excerpt":"","text":"莫比乌斯打表(phi可以删除)phi–欧拉函数表 miu–莫比乌斯函数表 fac–i最大的素因子辅助打phi表123456789101112131415int phi[maxn],miu[maxn],fac[maxn];ll f[maxn], F[maxn];void init(){ for (int i = 1; i < maxn; ++i) fac[i] = i; phi[1] = miu[1] = 1; for (int i = 2; i < maxn; ++i) { if (fac[i] == i) for (int j = i << 1; j < maxn; j += i) fac[j] = i; if (i / fac[i] % fac[i]) phi[i] = (fac[i] - 1)*phi[i / fac[i]], miu[i] = -miu[i / fac[i]]; //如果b质数 a%b!=0 phi(a*b) = phi(a)*b - phi(a) else phi[i] = fac[i] * phi[i / fac[i]], miu[i] = 0; //当b是质数,a%b==0,phi(a*b)=phi(a)*b }}求一个数的欧拉函数值–复杂度n^1/2123456789101112131415161718int miu(ll n){ int prime = 1; int flag = 0; for (int i = 2; i*i <= n; i++) { if (n%i == 0) { prime++; n /= i; if (n%i == 0) { flag = 1; break; } } } if (flag) return 0; if (prime % 2)return -1; else return 1;}","categories":[{"name":"数论模板","slug":"数论模板","permalink":"https://anoyer.cn/categories/数论模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"整除分块模板","slug":"整除分块模板","date":"2018-11-27T05:55:49.000Z","updated":"2018-12-02T06:36:32.531Z","comments":true,"path":"article/整除分块模板.html","link":"","permalink":"https://anoyer.cn/article/整除分块模板.html","excerpt":"","text":"1234for(int i=1,last;i<=n;i=last+1){ last=n/(n/i); //该区间的最后一个数 ans+=(last-i+1)*(n/i);}","categories":[{"name":"数论模板","slug":"数论模板","permalink":"https://anoyer.cn/categories/数论模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"浮点型数据高精度乘法","slug":"浮点型数据高精度乘法","date":"2018-11-27T05:55:49.000Z","updated":"2019-01-24T04:46:22.158Z","comments":true,"path":"article/浮点型数据高精度乘法.html","link":"","permalink":"https://anoyer.cn/article/浮点型数据高精度乘法.html","excerpt":"","text":"有2堆石子。A B两个人轮流拿,A先拿。每次可以从一堆中取任意个或从2堆中取相同数量的石子,但不可不取。拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出2堆石子的数量,问最后谁能赢得比赛。例如:2堆石子分别为3颗和5颗。那么不论A怎样拿,B都有对应的方法拿到最后1颗。Input第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10000)第2 - T + 1行:每行2个数分别是2堆石子的数量,中间用空格分隔。(1 <= N <= 10^18)Output共T行,如果A获胜输出A,如果B获胜输出B。Input示例33 53 41 9Output示例BAA12345678910111213141516171819202122232425262728293031323334353637//注意:sqrt产生精度问题 double最多存小数点后14位,模拟乘法 #include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long int ll;const int maxn = 1e4+5;//0.618033988749894848204586834... 拆成整数放进数组里,//拆成三部分即可 ll tmp[3] = { 618033988,749894848,204586834 };ll MOD = 1e9;int main(){ int t; scanf(\"%d\", &t); while (t--){ ll a, b; scanf(\"%lld%lld\", &a, &b); if (a > b){ ll t = a; a = b; b = t; } ll diff = b - a; //把10^18分成两部分10^9 ll ta = diff / MOD; ll tb = diff % MOD; ll tp = tb * tmp[2]; tp = ta * tmp[2] + tb * tmp[1] + tp / MOD; tp = ta * tmp[1] + tb * tmp[0] + tp / MOD; tp = ta * tmp[0] + tp / MOD + diff; if (tp == a) printf(\"B\\n\"); else printf(\"A\\n\"); } return 0;}","categories":[{"name":"数论模板","slug":"数论模板","permalink":"https://anoyer.cn/categories/数论模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"欧几里得及拓展欧几里得模板","slug":"拓展欧几里得及欧几里得","date":"2018-11-27T05:55:49.000Z","updated":"2019-01-24T04:43:34.296Z","comments":true,"path":"article/拓展欧几里得及欧几里得.html","link":"","permalink":"https://anoyer.cn/article/拓展欧几里得及欧几里得.html","excerpt":"","text":"欧几里得12345int gcd(int a,int b){ return (b==0)?a:gcd(b,a%b); //一条语句搞定(三元运算符)装逼,跟上面略有不同,上面做到t=0,这里做到b=0 }拓展欧几里得1234567891011121314151617181920212223int gcd(int a,int b){ return (b==0)?a:gcd(b,a%b); //一条语句搞定(三元运算符)装逼,跟上面略有不同,上面做到t=0,这里做到b=0 } ll lcm(ll a, ll b) { return a / gcd(a,b) * b;}int exgcd(int a,int b,int &x,int &y){ if(b==0) { x=1; y=0; return a; } int r=exgcd(b,a%b,x,y); int t=x; x=y; y=t-a/b*y; return r;}拓展欧几里得求整数解个数12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455ll gcd(ll a, ll b) { return b ? gcd(b, a%b) : a;} ll lcm(ll a, ll b) { return a / gcd(a, b) * b;} ll extend_gcd(ll a, ll b, ll&x, ll&y) { if (!b) { x = 1; y = 0; return a; } ll xt = 0, yt = 0; ll d = extend_gcd(b, a % b, xt, yt); x = yt; y = xt - yt * (a / b); return d;} ll cal(ll a, ll b, ll n) { //计算ax+by == n的非负整数解组数 ll x = 0, y = 0, d; d = extend_gcd(a, b, x, y); if (n % d != 0) { return 0; } x *= n / d, y *= n / d; ll LCM = lcm(a, b); ll t1 = LCM / a, t2 = LCM / b; if (x < 1) { ll num = (1 - x) / t1; x += num * t1; y -= num * t2; if (x < 1) { y -= t2; x += t1; } } if (y < 1) { ll num = (1 - y) / t2; y += num * t2; x -= num * t1; if (y < 1) { y += t2; x -= t1; } } ll ans = x > 0 && y > 0; if (ans) { ans += min((x - 1) / t1, ((n - 1) / b - y) / t2); ans += min((y - 1) / t2, ((n - 1) / a - x) / t1); } return ans;}","categories":[{"name":"数论模板","slug":"数论模板","permalink":"https://anoyer.cn/categories/数论模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"求大数的n次方对m取模(欧拉降幂)","slug":"大数次方模板","date":"2018-11-27T05:55:49.000Z","updated":"2019-01-24T04:43:14.274Z","comments":true,"path":"article/大数次方模板.html","link":"","permalink":"https://anoyer.cn/article/大数次方模板.html","excerpt":"","text":"求2^n次方对mod取模,n为一个大数12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455#include <stdio.h>#include <bits/stdc++.h>using namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;const int MAXN = 1e5 + 10;const int MOD = 1e9 + 7;char s[MAXN];long long phi(long long x){ long long ret = x; for (int i = 2; i * i <= x; ++i) if (x % i == 0) { ret -= ret / i; while (x % i == 0) x /= i; } if (x > 1) ret -= ret / x; return ret;}ll mpow(ll a, ll n, ll m) //a ^ n % m{ ll t = 1; while (n) { if (n & 1) t = (t * a) % m; a = (a * a) % m, n >>= 1; } return t;}int main(){#ifdef LOCAL //freopen(\"C:/input.txt\", \"r\", stdin);#endif int T; cin >> T; while (T--) { ll n = 0, p = phi(MOD); scanf(\"%s\", s); //求2^s次方 s为一个大数 for (int i = 0; s[i]; i++) n = (n * 10 + s[i] - '0') % p; n += p - 1; ll ans = mpow(2, n, MOD); cout << ans << endl; } return 0;}","categories":[{"name":"数论模板","slug":"数论模板","permalink":"https://anoyer.cn/categories/数论模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"博弈论模板","slug":"博弈论","date":"2018-11-27T05:55:49.000Z","updated":"2019-01-24T04:42:56.063Z","comments":true,"path":"article/博弈论.html","link":"","permalink":"https://anoyer.cn/article/博弈论.html","excerpt":"","text":"Bash–两人从一堆a个石子里面轮流取石子,每次最多去b个,取到最后一个石子获胜123456789101112int main() { int t; scanf(\"%d\", &t); while (t--) { int a, b,flag; scanf(\"%d%d\", &a, &b); if (a % (b + 1) == 0)flag = 2; else flag = 1; if (flag == 1)printf(\"A\\n\"); else printf(\"B\\n\"); }}Nim–两人从n堆石子中任选一堆取石子,不得不取,可以把一堆直接去玩,拿到最后一颗石子得人获胜12345678910111213int main() { int n; int stone, tag=0; scanf(\"%d\", &n); while (n--) { scanf(\"%d\", &stone); tag ^= stone; } // tag为0则为后⼿手赢,否则为先⼿手赢 if (tag == 0)printf(\"B\\n\"); else printf(\"A\\n\");}威佐夫博弈–有2堆石子。A B两个人轮流拿,A先拿。每次可以从一堆中取任意个或从2堆中取相同数量的石子,但不可不取。拿到最后1颗石子的人获胜1234567891011121314int main() { int n; int stone, tag=0; scanf(\"%d\", &n); while (n--) { int a, b; scanf(\"%d%d\", &a,&b); if (a < b)swap(a, b); int flag = (a - b)*(sqrt(5) + 1) / 2; //黄金分割线 // 如果flag == b,则为后⼿手赢,否则先⼿手赢(奇异局) if (flag == b)printf(\"B\\n\"); else printf(\"A\\n\"); }}SG打表1234567891011121314151617181920212223//f[]:可以取走的石子个数//sg[]:0~n的SG函数值//hash[]:mex{}int f[N],sg[N],hash[N]; void getSG(int n){ int i,j; memset(sg,0,sizeof(sg)); for(i=1;i<=n;i++) { memset(hash,0,sizeof(hash)); for(j=1;f[j]<=i;j++) hash[sg[i-f[j]]]=1; for(j=0;j<=n;j++) //求mes{}中未出现的最小的非负整数 { if(hash[j]==0) { sg[i]=j; break; } } }}SG-DFS打表12345678910111213141516171819202122232425int s[110],sg[10010],n;int SG_dfs(int x){ int i; if(sg[x]!=-1) return sg[x]; bool vis[110]; memset(vis,0,sizeof(vis)); for(i=0;i<n;i++) { if(x>=s[i]) { SG_dfs(x-s[i]); vis[sg[x-s[i]]]=1; } } int e; for(i=0;;i++) if(!vis[i]) { e=i; break; } return sg[x]=e;}一般DFS只在打表解决不了的情况下用,首选打表预处理。","categories":[{"name":"数论模板","slug":"数论模板","permalink":"https://anoyer.cn/categories/数论模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"Miller-Rabin素性测试模板","slug":"Miller-Rabin素性测试","date":"2018-11-27T05:55:49.000Z","updated":"2019-01-24T04:41:57.188Z","comments":true,"path":"article/Miller-Rabin素性测试.html","link":"","permalink":"https://anoyer.cn/article/Miller-Rabin素性测试.html","excerpt":"","text":"/** 随机素数测试(伪素数原理理)* CALL: bool res = miller(n);* 快速测试n是否满⾜足素数的“必要”条件,出错概率极低* 对于任意奇数n > 2和正整数s,算法出错概率≤2^(-s)*/123456789101112131415161718192021222324252627282930313233343536373839404142434445#include<stdio.h>#include<bits/stdc++.h>#define ll long long int#define met(a) memset(a,0,sizeof(a))#define fup(i,a,n,b) for(int i=a;i<n;i+=b)#define fow(j,a,n,b) for(int j=a;j>0;j-=b)#define MOD(x) (x)%modusing namespace std;const int maxn = 2*1e5 + 5;long long quicks(long long a, long long b, long long c){ long long ans = 1; a = a % c; while (b != 0){ if (b & 1) ans = (ans*a) % c; b >>= 1; a = (a*a) % c; } return ans;}bool Miller_Rabin_1(long long n) { //标准代码 long long t = 0; long long b = n - 1; while ((b & 1) == 0){ t++; b >>= 1; } //现在的a^(b*2^t)=1(mod n) long long a = rand() % (n - 1) + 1; //测试 long long x = quicks(a, b, n); //个人认为这里如果加上优先判定是不是1,n-1的话,会更快一点?是不是呢????? for (long long i = 1; i <= t; i++){ long long y = quicks(x, 2, n); if (y == 1 && x != 1 && x != n - 1) return false; //这里的意思是如果a^(d*2^r)是1,但是a^(d*2^(r-1))不是1也不是n-1的情况,这时候我们认为是合数 x = y; } if (x != 1) return false; else return true;}int main() { ll n; cin >> n; if (Miller_Rabin_1(n))cout << \"Yes\" << endl; else cout << \"No\" << endl; return 0;}","categories":[{"name":"数论模板","slug":"数论模板","permalink":"https://anoyer.cn/categories/数论模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"log(n)分解一个数的所有素因子模板","slug":"分解素因子","date":"2018-11-27T05:55:49.000Z","updated":"2019-01-24T04:42:50.934Z","comments":true,"path":"article/分解素因子.html","link":"","permalink":"https://anoyer.cn/article/分解素因子.html","excerpt":"","text":"123456789101112131415161718192021 //n为要分解的数 //Fac数组存所有质因子 //cnt为质因子个数void primeFactor(int n){ while(n%2==0){ Fac[cnt++]=2; n/=2; } // 经过第二步, 此时 n 一定为奇数 // 并且不存在偶数的素因子 // 所以我们可以跳过所有偶数 (i += 2) for(int i=3;i<=sqrt(n);i+=2){ while(n%i==0){ Fac[cnt++]=i; n/=i; } } //此处为了防止是一个大于 2 的素数 if(n>2)Fac[cnt++]=n;}","categories":[{"name":"数论模板","slug":"数论模板","permalink":"https://anoyer.cn/categories/数论模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"BM杜教","slug":"BM杜教","date":"2018-11-27T05:55:49.000Z","updated":"2019-01-24T04:38:32.292Z","comments":true,"path":"article/BM杜教.html","link":"","permalink":"https://anoyer.cn/article/BM杜教.html","excerpt":"","text":"123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <vector>#include <string>#include <map>#include <set>#include <cassert>#include<bits/stdc++.h>using namespace std;#define rep(i,a,n) for (int i=a;i<n;i++)#define per(i,a,n) for (int i=n-1;i>=a;i--)#define pb push_back#define mp make_pair#define all(x) (x).begin(),(x).end()#define fi first#define se second#define SZ(x) ((int)(x).size())typedef vector<int> VI;typedef long long ll;typedef pair<int,int> PII;const ll mod=1000000007;ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}// headint _,n;namespace linear_seq { const int N=10010; ll res[N],base[N],_c[N],_md[N]; vector<int> Md; void mul(ll *a,ll *b,int k) { rep(i,0,k+k) _c[i]=0; rep(i,0,k) if (a[i]) rep(j,0,k) _c[i+j]=(_c[i+j]+a[i]*b[j])%mod; for (int i=k+k-1;i>=k;i--) if (_c[i]) rep(j,0,SZ(Md)) _c[i-k+Md[j]]=(_c[i-k+Md[j]]-_c[i]*_md[Md[j]])%mod; rep(i,0,k) a[i]=_c[i]; } int solve(ll n,VI a,VI b) { // a 系数 b 初值 b[n+1]=a[0]*b[n]+...// printf(\"%d\\n\",SZ(b)); ll ans=0,pnt=0; int k=SZ(a); assert(SZ(a)==SZ(b)); rep(i,0,k) _md[k-1-i]=-a[i];_md[k]=1; Md.clear(); rep(i,0,k) if (_md[i]!=0) Md.push_back(i); rep(i,0,k) res[i]=base[i]=0; res[0]=1; while ((1ll<<pnt)<=n) pnt++; for (int p=pnt;p>=0;p--) { mul(res,res,k); if ((n>>p)&1) { for (int i=k-1;i>=0;i--) res[i+1]=res[i];res[0]=0; rep(j,0,SZ(Md)) res[Md[j]]=(res[Md[j]]-res[k]*_md[Md[j]])%mod; } } rep(i,0,k) ans=(ans+res[i]*b[i])%mod; if (ans<0) ans+=mod; return ans; } VI BM(VI s) { VI C(1,1),B(1,1); int L=0,m=1,b=1; rep(n,0,SZ(s)) { ll d=0; rep(i,0,L+1) d=(d+(ll)C[i]*s[n-i])%mod; if (d==0) ++m; else if (2*L<=n) { VI T=C; ll c=mod-d*powmod(b,mod-2)%mod; while (SZ(C)<SZ(B)+m) C.pb(0); rep(i,0,SZ(B)) C[i+m]=(C[i+m]+c*B[i])%mod; L=n+1-L; B=T; b=d; m=1; } else { ll c=mod-d*powmod(b,mod-2)%mod; while (SZ(C)<SZ(B)+m) C.pb(0); rep(i,0,SZ(B)) C[i+m]=(C[i+m]+c*B[i])%mod; ++m; } } return C; } int gao(VI a,ll n) { VI c=BM(a); c.erase(c.begin()); rep(i,0,SZ(c)) c[i]=(mod-c[i])%mod; return solve(n,c,VI(a.begin(),a.begin()+SZ(c))); }};int main() { while (~scanf(\"%d\",&n)) { vector<int>v; v.push_back(2);//前几项 v.push_back(4); v.push_back(6); v.push_back(8); v.push_back(10); v.push_back(12); //输入n ,输出第n项的值 printf(\"%d\\n\",linear_seq::gao(v,n-1)); }}","categories":[{"name":"数论模板","slug":"数论模板","permalink":"https://anoyer.cn/categories/数论模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"基数排序MSD模板","slug":"基数排序MSD","date":"2018-11-27T05:55:49.000Z","updated":"2019-01-24T04:43:09.682Z","comments":true,"path":"article/基数排序MSD.html","link":"","permalink":"https://anoyer.cn/article/基数排序MSD.html","excerpt":"","text":"123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657#include<stdio.h>#include<iostream>#include<algorithm>#include<string>#include<malloc.h>using namespace std;const int maxn=1e6+7;int arr[maxn]={12,14,54,5,6,3,9,8,47,89};int getdigit(int x,int d){ int a[]={1,1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9}; ////因为待排数据最大数据位数 return ((x/a[d])%10);}void msdradix_sort(int begin,int end,int d){ const int radix=10; //进制数 int count[radix],i,j; //count表示每个桶中元素个数 //置零 for(i=0;i<10;++i)count[i]=0; //给桶分配空间 int *bucket=(int *)malloc((end-begin+1)*sizeof(int)); //统计各桶需要装的元素的个数 for(i=begin;i<=end;++i){ count[getdigit(arr[i], d)]++; } //求出桶的边界索引,count[i]值为第i个桶的右边界索引+1 for(i=1;i<radix;++i){ count[i]+=count[i-1]; //每个桶的边界,便于下步将arr重新放入bucket里 } //这里要从右向左扫描,保证排序稳定性 for(i=end;i>=begin;--i){ j=getdigit(arr[i],d); //求出关键码的第d位的数字, 例如:576的第3位是5 bucket[count[j]-1]=arr[i]; //放入对应的桶中,count[j]-1是第j个桶的右边界索引 --count[j]; //第j个桶放下一个元素的位置(右边界索引+1) } //注意:此时count[i]为第i个桶左边界 //从各个桶中收集数据 for(i = begin, j = 0;i <= end; ++i, ++j){ arr[i] = bucket[j]; } //释放存储空间 free(bucket); //对每个桶再次排序 for(i=0;i<radix;i++){ int p1=begin+count[i]; //第I个桶的左边界 int p2=begin+count[i+1]-1 ; //第i个桶的右边界 if(p1<p2&&d>1){ msdradix_sort(p1, p2, d-1); //对第i个桶递归调用,进行基数排序,数位降 1 } }}int main(){ int len=10; for(int i=0;i<10;i++)cout<<arr[i]<<\" \"; cout<<endl; msdradix_sort(0,10-1,2); //2表示最高位数 for(int i=0;i<10;i++)cout<<arr[i]<<\" \"; cout<<endl; }","categories":[{"name":"数论模板","slug":"数论模板","permalink":"https://anoyer.cn/categories/数论模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"Hexo的入门教程及Next主题配置","slug":"Hexo 入门教程","date":"2018-11-22T03:35:22.000Z","updated":"2019-01-24T04:41:22.299Z","comments":true,"path":"article/Hexo 入门教程.html","link":"","permalink":"https://anoyer.cn/article/Hexo 入门教程.html","excerpt":"","text":"博主链接Hexo的入门教程及Next主题配置Node及Hexo安装hexo是什么?简单的说,就是一个静态博客的生成工具也可以说是一个搭建静态博客的框架,我这个博客就是就是基于hexo生成的。9月份把这个博客用hexo折腾出来,前几天ACM区域赛事结束了,所以想记录下来折腾的过程,留着以后备用。这里只说如何在windows下成功安装hexo并运行起来,关于主题以及配置不做记录。安装Node.js因为Hexo是基于Node.js的,所以必须先安装Node,所以请点击这里去下载适合自己windows版本的Node吧。(注意:在安装步骤里Custom Setup这一步记得选Add to PATH)。安装好以后,打开CMD,(那对于小白来说如何打开CMD呢?win+R然后输入cmd,点击确定,这样CMD就打开了.),输入npm -v,如果出现版本号,那说明安装成功了,并且环境变量也配置好了,如果是未知命令那就要配置下环境变量。安装Hexo还是打开CMD然后输入安装hexo的命令:1npm install -g hexo-cli这一步需要一点时间,请稍等一会,让他安装好。安装完成后在CMD里输入hexo -v出现一系列版本号就是安装成功啦QAQ到这里,就要恭喜你成功完成了Hexo的安装了。生成一个博客初始化个人博客仓库在电脑中建一个文件夹(路径根据自己爱好,我是在E盘里建了一个名为Blog的文件夹),我在这里命名为Blog吧。然后通过CMD的cd到这个文件夹下,运行命令:1hexo init这个时候会将这个文件夹初始化为一个博客专用文件夹,生成过程稍微要点时间,耐心等待。然后输入:1npm install之后npm将会自动安装你需要的组件,只需要等待npm操作即可。开始生成博客继续操作:1hexo g然后输入:1hexo s会出现:在浏览器里打开http://localhost:4000/,你将会看到:到这里你已经有了一个属于你的本地Blog了。Coding部署why不是Github,因为我个人认为搭建一个个人博客用Github会有诸多不便。比如:1.搭建一个博客肯定就要往百度推送,不然别人搜不到你的博客有什么意思。而如果部署Github的话,百度无法抓取blog链接。2.Coding服务器在中国,所以Blog加载速度比GitHub快很多。注册Coding现在我们的博客已经在本地搭建完成,那要怎么才能让别人看到我们的博客呢?我们选择把我们的静态网页的代码发到coding上去,然后由coding负责将我们的代码展现出来。注册步骤比较简单,点击这里去注册。需要声明的是,如果你以后不想绑定独立域名,那么coding给你的域名默认为 仓库名.coding.me而你需要建立的仓库名需要与你的用户名保持一致,不然会出现问题,所以慎重起名字。然后填好个人信息,就会升级为银牌会员(能拥有5个私人仓库)。新建仓库在coding上面新建仓库项目名称写成你的用户名,比如我的仓库名字为Blog,然后描述写不写都行,自己选择公有还是私有,然后直接选择创建项目。配置ssh这个过程的目的是在你的电脑和coding之间建立联系的通道,不然谁都能往上面增加内容,那你的博客岂不乱套了?首先查看目录C:Users\\用户名有没有.ssh目录,如果没有,cmd在本地blog路径下,输入命令:1ssh-keygen -t rsa -C "这里填上你的邮箱地址"然后按3个回车。再检查有没有.ssh目录,打开目录,你会看到出现3个文件:然后用notepad++打开id——rsa.pub(这个是公钥,不带pub的是私钥,这个不要泄露出去),你会开到一堆字母,全选复制下来。下面打来浏览器,进入你刚才创建的仓库,设置-部署公钥-新建部署公钥,公钥名称可以不填,将刚才复制的公钥粘贴在公钥内容里面。把授予权限打上勾!,然后添加就可以了。站点配置下面我们进行博客的站点配置,打开Blog文件夹,你会看到这样的文件这个文件的意思就是对你的博客进行一些设置,比如的你的用户名等等,记住这个文件特别重要!,以后你进行配置都要在这里进行,下面我们用notepad++打开它,这是你的网站信息要是不懂英文就查字典写,注意:名称后面要放空格,不然会出错!!!。然后滑倒最下面,填写你的git地址,这一步特别关键,你可以照我这个写,同样,别忘了空格!(本张图片来自vzhiwen,因为我Blog修改了域名,后面会讲到)然后点击文件保存上传代码在Blog文件路径里,依次输入下列命令:123hexo cleanhexo dhexo g如果提及不上去,就下载一个插件,在命令行里输入:1npm install hexo-deployer-git --save再次提交就可以了clean表示清除缓存,d是deploy的缩写,意思是将代码推送到coding,然后等待一些时间,第一次需要输入coding的用户名和密码或者询问你yes/no,按照说明输入即可,出现下面的字样说明推送完毕打开pages服务打开浏览器,进入coding,代码-pages服务,部署来源选择master,然后可以选择https访问()这个就是打开你网页的时候地址栏前面显示的绿锁头,后面写着安全,如果不选择,就会出现叹号,不过影响不大。现在,你的博客已经基本配置完成,现在就打开你的浏览器,输入你的网址试试吧!主题配置如果你感觉默认Blog主题可以通过这一块来学习,如果给自己Blog换个主题。主题安装为了使博客不太难看,我们需要安装一个主题,切换至刚刚生成的Hexo 目录,安装主题$ cd Blog$ git clone https://github.com/iissnan/hexo-theme-next themes/next如果没有Git可以去下一个,百度有一堆这里选了一个极简的主题,也是Hexo众多主题中最受欢迎的一个。上面出现的喵神的主题 在这里。Hexo也有更多主题供你选择。启用主题:在你的站点配置文件_config.yml里修改theme: next //刚刚安装主题的,名字主题配置:这是 NexT 默认的 Scheme —— Muse ,现在,你已经成功安装并启用了 NexT 主题。下一步我们将要更改一些主题的设定,包括个性化以及集成第三方服务。 4)主题设定 选择 Scheme Scheme 是 NexT 提供的一种特性,借助于 Scheme,NexT 为你提供多种不同的外观。同时,几乎所有的配置都可以 在 Scheme 之间共用。目前 NexT 支持三种 Scheme,他们是:1234Muse - 默认 Scheme,这是 NexT 最初的版本,黑白主调,大量留白Mist - Muse 的紧凑版本,整洁有序的单栏外观Pisces - 双栏 Scheme,小家碧玉似的清新Scheme 的切换通过更改 主题配置文件,搜索 scheme 关键字。 你会看到有三行 scheme 的配置,将你需用启用的 scheme 前面注释 # 即可。 选择 Pisce Scheme123#scheme: Muse#scheme: Mistscheme: Pisces写文章所有基础框架都已经创建完成,接下来可以开始写你的第一篇博客了在Blog/source/_posts下创建你的第一个博客吧,例如,创建一个名为FirstNight.md的文件,用Markdown大肆发挥吧,注意保存。如:1234---title: First Night---> 我有一头**小毛驴**,可是我从来都不骑。然后本体测试看看,输入hexo s测试服务启动,你可以在浏览器中输入https://localhost:4000 访问了如果测试没问题,就可以上传到Coding了依次输入下面命令123hexo cleanhexo dhexo g然后你就可以再浏览器里输入你的Coding项目链接访问了标签 分类 关于 标签图标 侧边栏菜单创建文章在Blog路径下输入:1hexo new "文章名称"生产后会提示你文件路径,一般在Blog/source/_posts下文章基本设置12345678910---title: CentOS7下Tomcat启动慢的原因及解决方案date: 2017-12-02 21:01:24comments: true #是否可评论toc: true #是否显示文章目录categories: "云服务器" #分类tags: #标签 - centOS - tomcat---创建标签1hexo new page tags基本设置123title: tagsdate: 2017-12-02 21:01:24type: "tags"创建分类1hexo new page categories基本设置123title: categoriesdate: 2017-12-02 21:01:24type: "categories"标签图标实现效果图修改模板/themes/next/layout/_macro/post.swig,搜索 rel="tag">#,将 # 换成<i class="fa fa-tag"></i>设置菜单:设置 菜单 菜单配置包括三个部分,第一是菜单项(名称和链接),第二是菜单项的显示文本,第三是菜单项对应的图标。 NexT 使用的是 Font Awesome 提供的图标, Font Awesome 提供了 600+ 的图标,可以满足绝大的多数的场景,同时无须担心在 Retina 屏幕下 图标模糊的问题。 编辑主题配置文件,修改以下内容: 设定菜单内容,对应的字段是 menu。 菜单内容的设置格式是:item name: link。其中 item name 是一个名称,这个名称并不直接显示在页面上,她将用于匹配图标以及翻译。 菜单示例配置(在主题配置文件中)1234567menu: home: / archives: /archives #about: /about #categories: /categories tags: /tags #commonweal: /404.html若你的站点运行在子目录中,请将链接前缀的 / 去掉 NexT 默认的菜单项有(标注 的项表示需要手动创建这个页面):键值设定值显示文本(简体中文)homehome: /主页archivesarchives: /archives归档页categoriescategories: /categories分类页tagstags: /tags标签页aboutabout: /about关于页面commonwealcommonweal: /404.html公益 404设置菜单项的显示文本。在第一步中设置的菜单的名称并不直接用于界面上的展示。Hexo 在生成的时候将使用 这个名称查找对应的语言翻译,并提取显示文本。这些翻译文本放置在 NexT 主题目录下的 languages/{language}.yml ({language} 为你所使用的语言)。 以简体中文为例,若你需要添加一个菜单项,比如 something。那么就需要修改简体中文对应的翻译文件 languages/zh-Hans.yml,在 menu 字段下添加一项:123456789menu: home: 首页 archives: 归档 categories: 分类 tags: 标签 about: 关于 search: 搜索 commonweal: 公益404 something: 有料设定菜单项的图标,对应的字段是 menu_icons。 此设定格式是 item name: icon name,其中 item name 与上一步所配置的菜单名字对应,icon name 是 Font Awesome 图标的 名字。而 enable 可用于控制是否显示图标,你可以设置成 false 来去掉图标。 菜单图标配置示例123456789menu_icons: enable: true # Icon Mapping. home: home about: user categories: th tags: tags archives: archive commonweal: heartbeat在菜单图标开启的情况下,如果菜单项与菜单未匹配(没有设置或者无效的 Font Awesome 图标名字) 的情况下,NexT 将会使用 作为图标。 请注意键值(如 home)的大小写要严格匹配 7)侧栏 默认情况下,侧栏仅在文章页面(拥有目录列表)时才显示,并放置于右侧位置。 可以通过修改 主题配置文件 中的 sidebar 字段来控制侧栏的行为。侧栏的设置包括两个部分,其一是侧栏的位置, 其二是侧栏显示的时机。 设置侧栏的位置,修改 sidebar.position 的值,支持的选项有:12left - 靠左放置right - 靠右放置目前仅 Pisces Scheme 支持 position 配置。影响版本5.0.0及更低版本。12sidebar: position: left设置侧栏显示的时机,修改 sidebar.display 的值,支持的选项有:123456post - 默认行为,在文章页面(拥有目录列表)时显示always - 在所有页面中都显示hide - 在所有页面中都隐藏(可以手动展开)remove - 完全移除sidebar: display: post搜索搜索功能真心好用,当文章多起来的时候,标签提供的作用已经很少了,只能简单索引,搜索却能精确查找,这里我用的依旧是最简单的本地站内搜索。安装插件1npm install hexo-generator-searchdb --save修改 站点配置 文件12345search: path: search.xml field: post format: html limit: 10000修改 主题配置文件12local_search: enable: true头像 (头像旋转)实现效果图:设置头像编辑 主题配置文件_config.yml, 修改字段1avatar, 值设置成头像的链接地址。其中,头像的链接地址可以是地址值完整的互联网URI:http://example.com/avatar.png站点内的地址将头像放置主题目录下的source/uploads/(新建 uploads 目录若不存在) 配置为:avatar: /uploads/avatar.png或者 放置在 source/images/ 目录下, 配置为:avatar: /images/avatar.png1avatar: http://example.com/avatar.png实现头像旋转:打开\\themes\\next\\source\\css\\_common\\components\\sidebar\\sidebar-author.styl,在里面添加如下代码:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960.site-author-image { display: block; margin: 0 auto; padding: $site-author-image-padding; max-width: $site-author-image-width; height: $site-author-image-height; border: $site-author-image-border-width solid $site-author-image-border-color; /* 头像圆形 */ border-radius: 80px; -webkit-border-radius: 80px; -moz-border-radius: 80px; box-shadow: inset 0 -1px 0 #333sf; /* 设置循环动画 [animation: (play)动画名称 (2s)动画播放时长单位秒或微秒 (ase-out)动画播放的速度曲线为以低速结束 (1s)等待1秒然后开始动画 (1)动画播放次数(infinite为循环播放) ]*/ /* 鼠标经过头像旋转360度 */ -webkit-transition: -webkit-transform 1.0s ease-out; -moz-transition: -moz-transform 1.0s ease-out; transition: transform 1.0s ease-out;}img:hover { /* 鼠标经过停止头像旋转 -webkit-animation-play-state:paused; animation-play-state:paused;*/ /* 鼠标经过头像旋转360度 */ -webkit-transform: rotateZ(360deg); -moz-transform: rotateZ(360deg); transform: rotateZ(360deg);}/* Z 轴旋转动画 */@-webkit-keyframes play { 0% { -webkit-transform: rotateZ(0deg); } 100% { -webkit-transform: rotateZ(-360deg); }}@-moz-keyframes play { 0% { -moz-transform: rotateZ(0deg); } 100% { -moz-transform: rotateZ(-360deg); }}@keyframes play { 0% { transform: rotateZ(0deg); } 100% { transform: rotateZ(-360deg); }}友链编辑主题配置文件添加:12345# titlelinks_title: Linkslinks: MacTalk: http://macshuo.com/ Title: http://example.com/社交网站侧栏社交链接的修改包含两个部分,第一是链接,第二是链接图标。 两者配置均在主题配置文件中。1、 链接放置在 social字段下,一行一个链接。其键值格式是 显示文本: 链接地址。12345678# Social linkssocial: GitHub: https://github.com/your-user-name Twitter: https://twitter.com/your-user-name 微博: http://weibo.com/your-user-name 豆瓣: http://douban.com/people/your-user-name 知乎: http://www.zhihu.com/people/your-user-name # 等等123456782、 设定链接的图标,对应的字段是 social_icons。其键值格式是 匹配键:Font Awesome图标名称, 匹配键 与上一步所配置的链接的 显示文本 相同(大小写严格匹配),图标名称 是Font Awesome图标的名字(不必带 fa- 前缀)。 enable 选项用于控制是否显示图标,你可以设置成 false 来去掉图标。1234567# Social Iconssocial_icons: enable: true # Icon Mappings GitHub: github Twitter: twitter 微博: weibo浏览量 访客量 阅读数打开文件: themes/next/_config.yml1234567891011121314151617# Show PV/UV of the website/page with busuanzi.# Get more information on http://ibruce.info/2015/04/04/busuanzi/busuanzi_count: # count values only if the other configs are false enable: true # custom uv span for the whole site site_uv: true site_uv_header: <i class=\"fa fa-user\"></i> 访问人数 site_uv_footer: 人 # custom pv span for the whole site site_pv: true site_pv_header: <i class=\"fa fa-eye\"></i> 总访问量 site_pv_footer: 次 # custom pv span for one page only page_pv: true page_pv_header: <i class=\"fa fa-file-o\"></i> 阅读数 page_pv_footer:相关操作:enable: true添加相关中文说明,不添加也行。修改统计规则及busuanzi失效修复打开\\themes\\next\\layout_partials\\footer.swig文件,在copyright前加上画红线这句话:代码如下:1<script async src=\"https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js\"></script>然后再合适的位置添加显示统计的代码,如图:代码如下:12345<div class=\"powered-by\"><i class=\"fa fa-user-md\"></i><span id=\"busuanzi_container_site_uv\"> 本站访客数:<span id=\"busuanzi_value_site_uv\"></span></span></div>在这里有两中不同计算方式的统计代码:pv的方式,单个用户连续点击n篇文章,记录n次访问量123<span id=\"busuanzi_container_site_pv\"> 本站总访问量<span id=\"busuanzi_value_site_pv\"></span>次</span>uv的方式,单个用户连续点击n篇文章,只记录1次访客数123<span id=\"busuanzi_container_site_uv\"> 本站总访问量<span id=\"busuanzi_value_site_uv\"></span>次</span>添加之后再执行hexo d -g,然后再刷新页面就能看到效果字数统计 阅读时长 总字数在站点的根目录下:1$ npm i --save hexo-wordcount打开 themes/next/_config.yml ,搜索关键字 post_wordcount:1234567891011# Post wordcount display settings# Dependencies: https://github.com/willin/hexo-wordcountpost_wordcount: item_text: true #字数统计 wordcount: true #预览时间 min2read: true #总字数,显示在页面底部 totalcount: true separated_meta: true文章发表 更新时间打开主题配置文件 _config.yml ,搜索关键字 updated_at 设置为 true :123456# Post meta display settingspost_meta: item_text: true created_at: true updated_at: ture categories: true编辑文章,增加关键字updated(next可以根据文章改变时间自动更改)12345---layout: layouttitle: 关于date: 2017-08-18 15:41:18updated: 2017-09-05 20:18:54 #手动添加更新时间,不加这一行会自动更新背景图片在 themes/next/source/css/_custom/custom.styl 中添加如下代码:1234567body{ background:url(/images/bg.jpg); background-size:cover; background-repeat:no-repeat; background-attachment:fixed; background-position:center;}动态粒子修改_layout.swig打开 next/layout/_layout.swig在 < /body>之前添加代码(注意不要放在< /head>的后面)123{% if theme.canvas_nest %}<script type="text/javascript" src="//cdn.bootcss.com/canvas-nest.js/1.0.0/canvas-nest.min.js"></script>{% endif %}修改配置文件打开 /next/_config.yml,在里面添加如下代码:(可以放在最后面)123456# --------------------------------------------------------------# background settings# --------------------------------------------------------------# add canvas-nest effect# see detail from https://github.com/hustcc/canvas-nest.jscanvas_nest: true到此就结束了,运行 hexo clean,然后运行 hexo g,然后运行 hexo s,最后打开浏览器在浏览器的地址栏输入 localhost:4000 就能看到效果了\\( ̄︶ ̄)/如果你感觉默认的线条太多的话可以这么设置====>在上一步修改 _layout.swig中,把刚才的这些代码:123{% if theme.canvas_nest %}<script type=\"text/javascript\" src=\"//cdn.bootcss.com/canvas-nest.js/1.0.0/canvas-nest.min.js\"></script>{% endif %}改为1234{% if theme.canvas_nest %}<script type=\"text/javascript\"color=\"0,0,255\" opacity='0.7' zIndex=\"-2\" count=\"99\" src=\"//cdn.bootcss.com/canvas-nest.js/1.0.0/canvas-nest.min.js\"></script>{% endif %}配置项说明color :线条颜色, 默认: '0,0,0';三个数字分别为(R,G,B)opacity: 线条透明度(0~1), 默认: 0.5count: 线条的总数量, 默认: 150zIndex: 背景的z-index属性,css属性用于控制所在层的位置, 默认: -1加载动画打开 themes/next/_config.yml ,搜索关键字 pace ,设置为 true ,可以更换加载样式:12345678910111213141516171819# Progress bar in the top during page loading.pace: true# Themes list:#pace-theme-big-counter#pace-theme-bounce#pace-theme-barber-shop#pace-theme-center-atom#pace-theme-center-circle#pace-theme-center-radar#pace-theme-center-simple#pace-theme-corner-indicator#pace-theme-fill-left#pace-theme-flash#pace-theme-loading-bar#pace-theme-mac-osx#pace-theme-minimal# For example# pace_theme: pace-theme-center-simplepace_theme: pace-theme-flash #替换更换样式透明背景内容板块透明博客根目录 themes\\next\\source\\css\\_schemes\\Pisces\\_layout.styl 文件 .content-wrap 标签下 background: white修改为:1background: rgba(255,255,255,0.7); //0.7是透明度菜单栏背景博客根目录 themes\\next\\source\\css\\_schemes\\Pisces\\_layout.styl 文件 .header-inner 标签下 background: white修改为:1background: rgba(255,255,255,0.7); //0.7是透明度站点概况背景博客根目录 themes\\next\\source\\css\\_schemes\\Pisces\\_sidebar.styl 文件 .sidebar-inner 标签下 background: white修改为:1background: rgba(255,255,255,0.7); //0.7是透明度然后修改博客根目录 themes\\next\\source\\css\\_schemes\\Pisces\\_layout.styl 文件 .sidebar 标签下 background: $body-bg-color修改为:1background: rgba(255,255,255,0.7); //0.7是透明度按钮背景博客根目录 themes\\next\\source\\css\\_common\\components\\post\\post-button.styl 同上修改对应位置为 background: transparent;修改底部Hexo和主题信息在图标库中找到你自己喜欢的图标, 修改桃心,打开 themes/next_config.yml ,搜索关键字 authoricon,替换图标名12# icon between year and author @Footerauthoricon: id-card2.隐藏网页底部 Hexo 强力驱动打开主题配置文件,搜索关键字 copyright ,如下:(或者直接删除)12# Footer `powered-by` and `theme-info` copyrightcopyright: false博客运行时间打开next\\layout\\_partials路径中的footer.swig,在文件中合适位置(我加在了最后面)加入下面代码段:1<span id=\"timeDate\" title=\"网站运行时间\">载入天数...</span><span id=\"times\" title=\"网站运行时间\">载入时分秒...</span>在next\\layout\\_layout.swig中插入下面代码块:12345678910111213141516<!--此处为建站时间 --><script> var now = new Date(); function createtime() { var grt= new Date(\"09/24/2018 23:45:01\"); now.setTime(now.getTime()+250); days = (now - grt ) / 1000 / 60 / 60 / 24; dnum = Math.floor(days); hours = (now - grt ) / 1000 / 60 / 60 - (24 * dnum); hnum = Math.floor(hours); if(String(hnum).length ==1 ){hnum = \"0\" + hnum;} minutes = (now - grt ) / 1000 /60 - (24 * 60 * dnum) - (60 * hnum); mnum = Math.floor(minutes); if(String(mnum).length ==1 ){mnum = \"0\" + mnum;} seconds = (now - grt ) / 1000 - (24 * 60 * 60 * dnum) - (60 * 60 * hnum) - (60 * mnum); snum = Math.round(seconds); if(String(snum).length ==1 ){snum = \"0\" + snum;} document.getElementById(\"timeDate\").innerHTML =\"(ㆆᴗㆆ)本弱已菜菜的存活了\"+dnum+\"&thinsp;天\"; document.getElementById(\"times\").innerHTML = hnum + \"&thinsp;时\" + mnum + \"&thinsp;分\" + snum + \"&thinsp;秒\"; } setInterval(\"createtime()\",250);然后就可以上传看效果啦版权声明自己使用的Hexo+NexT主题,主题默认的版权声明配置在themes\\next\\_config.yml文件中12345Copy# Declare license on postspost_copyright: enable: false license: CC BY-NC-SA 3.0 license_url: https://creativecommons.org/licenses/by-nc-sa/3.0/直接把enable 改为true即可开启。文章结尾–加入感谢阅读实现效果图具体实现方法在路径 \\themes\\next\\layout\\_macro 中新建 passage-end-tag.swig 文件,并添加以下内容:12345<div> {% if not is_index %} <div style=\"text-align:center;color: #ccc;font-size:14px;\">-------------本文结束<i class=\"fa fa-paw\"></i>感谢您的阅读-------------</div> {% endif %}</div>接着打开\\themes\\next\\layout\\_macro\\post.swig文件,在post-body 之后, post-footer 之前添加如下画红色部分代码(post-footer之前两个DIV):代码如下:12345<div> {% if not is_index %} {% include 'passage-end-tag.swig' %} {% endif %}</div>然后打开主题配置文件(_config.yml),在末尾添加:123# 文章末尾添加“本文结束”标记passage_end_tag: enabled: true完成以上设置之后,在每篇文章之后都会添加如上效果图的样子。Valine评论注册Leancloud评论系统其实是放在Leancloud上的,因此首先需要去注册一个账号Leancloud官网,点我注册注册完以后需要创建一个应用,名字可以:blog ,然后 进入应用->设置->应用key获取你的appid 和 appkey 如图所示:博客主题配置文件配置拿到你的appid和appkey之后,打开主题配置文件 搜索 valine,填入appid 和 appkey123456789valine: enable: true appid: your app id appkey: your app key notify: false # mail notifier , https://github.com/xCss/Valine/wiki verify: false # Verification code placeholder: just so so guest_info: nick,mail,link pageSize: 10配置域名记得在Leancloud -> 设置 -> 安全中心 -> Web 安全域名 把你的域名加进去百度分享ShareSDK开始使用注册一个账号,然后打开后台,找到appkey打开1博客\\themes\\next\\layout\\_partials\\share新建一个文件名为 sharesdk.swig ,并输入以下代码:12345678910111213141516171819202122232425262728<!--MOB SHARE BEGIN--> <div class=\"-mob-share-ui-button -mob-share-open\">分享</div> <div class=\"-mob-share-ui\" style=\"display: none\"> <ul class=\"-mob-share-list\"> <li class=\"-mob-share-weibo\"><p>新浪微博</p></li> <li class=\"-mob-share-tencentweibo\"><p>腾讯微博</p></li> <li class=\"-mob-share-qzone\"><p>QQ空间</p></li> <li class=\"-mob-share-qq\"><p>QQ好友</p></li> <li class=\"-mob-share-weixin\"><p>微信</p></li> <li class=\"-mob-share-douban\"><p>豆瓣</p></li> <li class=\"-mob-share-renren\"><p>人人网</p></li> <li class=\"-mob-share-kaixin\"><p>开心网</p></li> <li class=\"-mob-share-facebook\"><p>Facebook</p></li> <li class=\"-mob-share-twitter\"><p>Twitter</p></li> <li class=\"-mob-share-pocket\"><p>Pocket</p></li> <li class=\"-mob-share-google\"><p>Google+</p></li> <li class=\"-mob-share-youdao\"><p>有道云笔记</p></li> <li class=\"-mob-share-mingdao\"><p>明道</p></li> <li class=\"-mob-share-pengyou\"><p>朋友网</p></li> <li class=\"-mob-share-tumblr\"><p>Tumblr</p></li> <li class=\"-mob-share-instapaper\"><p>Instapaper</p></li> <li class=\"-mob-share-linkedin\"><p>LinkedIn</p></li> </ul> <div class=\"-mob-share-close\">取消</div> </div> <div class=\"-mob-share-ui-bg\"></div> <script id=\"-mob-share\" src=\"http://f1.webshare.mob.com/code/mob-share.js?appkey={{ theme.shareSDKappkey }}\"></script> <!--MOB SHARE END-->打开:1LX-Blog\\themes\\next\\layout\\post.swig将以下代码:1234567891011<div class=\"post-spread\"> {% if theme.jiathis %} {% include '_partials/share/jiathis.swig' %} {% elseif theme.baidushare %} {% include '_partials/share/baidushare.swig' %} {% elseif theme.add_this_id %} {% include '_partials/share/add-this.swig' %} {% elseif theme.duoshuo_shortname and theme.duoshuo_share %} {% include '_partials/share/duoshuo_share.swig' %} {% endif %} </div>改成:12345678910111213<div class=\"post-spread\"> {% if theme.jiathis %} {% include '_partials/share/jiathis.swig' %} {% elseif theme.baidushare %} {% include '_partials/share/baidushare.swig' %} {% elseif theme.add_this_id %} {% include '_partials/share/add-this.swig' %} {% elseif theme.duoshuo_shortname and theme.duoshuo_share %} {% include '_partials/share/duoshuo_share.swig' %} {% elseif theme.sharesdk %} {% include '_partials/share/sharesdk.swig' %} {% endif %} </div>打开 主题配置文件,添加以下代码:12sharesdk: trueshareSDKappkey: 你的appkey向百度站长推送当我们一开始建完博客时,搜索引擎是搜索不到的,我们需要做一项工作就是通知搜索引擎收录我们的网站。如何被百度收录这里需要做两个事情,一个是验证网站,一个是链接提交.验证网证我们到百度站长平台里面的站长工具里面去验证网站,大概步骤如下:第一步:输入网站第二步:站点属性第三步:验证网站前两步都很简单,第三步:验证网站有以下三种方法:文件验证HTML标签验证CNAME验证这里我们选择文件验证的方法,然后会得到一个baidu_verify_xxxxx.html文件。我使用的主题是next,所以我把这个验证文件放在theme/next/source/根目录下面,这样当我们编译网站hexo generate的时候,这个文件会被原封不动的拷贝到我们博客的public/根目录下。好,重要编译hexo并部署,完成验证.链接提交接下来我们进入链接提交.链接提交有手动和自动两种方法,手动就是每次你有新的链接生成,你就需要手动提交链接到百度,这种方法太麻烦了,不使用。自动提交有三种方式:主动推送(实时)自动推送sitemap这里我们选择sitemap方式。安装hexo的sitemap网站地图生成插件1npm install hexo-generator-baidu-sitemap --save在你的hexo站点的_config.yml添加下面的代码123# hexo sitemap网站地图baidusitemap: path: baidusitemap.xml配置成功后,hexo编译时会在hexo站点根目录生成baidusitemap.xml,部署网站后,提交到百度:代码复制下载插件clipboard.js 。将下载的clipboard.js文件下的dist文件夹中的文件拖到.\\themes\\next\\source\\js\\src 文件夹下也是在.\\themes\\next\\source\\js\\src目录下,创建clipboard-use.js,文件内容如下:1234567891011121314151617/*页面载入完成后,创建复制按钮*/!function (e, t, a) { /* code */ var initCopyCode = function(){ var copyHtml = ''; copyHtml += '<button class=\"btn-copy\" data-clipboard-snippet=\"\">'; copyHtml += ' <i class=\"fa fa-globe\"></i><span>copy</span>'; copyHtml += '</button>'; $(\".highlight .code pre\").before(copyHtml); new ClipboardJS('.btn-copy', { target: function(trigger) { return trigger.nextElementSibling; } }); } initCopyCode();}(window, document);在.\\themes\\next\\source\\css\\_custom\\custom.styl样式文件中添加下面代码:123456789101112131415161718192021222324252627282930313233343536//代码块复制按钮.highlight{ //方便copy代码按钮(btn-copy)的定位 position: relative;}.btn-copy { display: inline-block; cursor: pointer; background-color: #eee; background-image: linear-gradient(#fcfcfc,#eee); border: 1px solid #d5d5d5; border-radius: 3px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; -webkit-appearance: none; font-size: 13px; font-weight: 700; line-height: 20px; color: #333; -webkit-transition: opacity .3s ease-in-out; -o-transition: opacity .3s ease-in-out; transition: opacity .3s ease-in-out; padding: 2px 6px; position: absolute; right: 5px; top: 5px; opacity: 0;}.btn-copy span { margin-left: 5px;}.highlight:hover .btn-copy{ opacity: 1;}在.\\themes\\next\\layout\\_layout.swig文件中,添加引用(注:在 swig 末尾或 body 结束标签(</body>)之前添加):123<!-- 代码块复制功能 --> <script type=\"text/javascript\" src=\"/js/src/clipboard.min.js\"></script> <script type=\"text/javascript\" src=\"/js/src/clipboard-use.js\"></script>博客压缩加速访问在站点的根目录下执行以下命令:12$ npm install gulp -g$ npm install gulp-minify-css gulp-uglify gulp-htmlmin gulp-htmlclean gulp --save在如下图所示,新建 gulpfile.js ,并填入以下内容:123456789101112131415161718192021222324252627282930313233var gulp = require('gulp');var minifycss = require('gulp-minify-css');var uglify = require('gulp-uglify');var htmlmin = require('gulp-htmlmin');var htmlclean = require('gulp-htmlclean');// 压缩 public 目录 cssgulp.task('minify-css', function() { return gulp.src('./public/**/*.css') .pipe(minifycss()) .pipe(gulp.dest('./public'));});// 压缩 public 目录 htmlgulp.task('minify-html', function() { return gulp.src('./public/**/*.html') .pipe(htmlclean()) .pipe(htmlmin({ removeComments: true, minifyJS: true, minifyCSS: true, minifyURLs: true, })) .pipe(gulp.dest('./public'))});// 压缩 public/js 目录 jsgulp.task('minify-js', function() { return gulp.src('./public/**/*.js') .pipe(uglify()) .pipe(gulp.dest('./public'));});// 执行 gulp 命令时执行的任务gulp.task('default', [ 'minify-html','minify-css','minify-js']);生成博文是执行 hexo g && gulp 就会根据 gulpfile.js 中的配置,对 public 目录中的静态资源文件进行压缩。主页文章添加阴影效果实现效果图具体实现方法打开\\themes\\next\\source\\css_custom\\custom.styl,向里面加入:12345678/*主页文章添加阴影效果*/ .post { margin-top: 60px; margin-bottom: 60px; padding: 25px; -webkit-box-shadow: 0 0 5px rgba(202, 203, 203, .5); -moz-box-shadow: 0 0 5px rgba(202, 203, 204, .5); }修改代码块自定义样式打开\\themes\\next\\source\\css\\_custom\\custom.styl,向里面加入:(颜色可以自己定义)123456789101112131415// Custom styles.code { color: #ff7600; background: #fbf7f8; margin: 2px;}// 大代码块的自定义样式.highlight, pre { margin: 5px 0; padding: 5px; border-radius: 3px;}.highlight, code, pre { border: 1px solid #d6d6d6;}博客宝宝效果如图安装依赖包,在站点根目录,打开Git Bash ,安装hexo-helper-live2d1npm install --save hexo-helper-live2d在站点配置文件或者主题配置文件添加以下内容1234567891011121314live2d: enable: true scriptFrom: local pluginRootPath: live2dw/ pluginJsPath: lib/ pluginModelPath: assets/ model: use: live2d-widget-model-wanko display: position: right width: 150 height: 300 mobile: show: true安装需要的宠物文件1npm install {packagename}如效果图所示的宠物名为haruto, 则为 npm install live2d-widget-model-haruto,其他宠物包点击live2d-widget-models。如果需要修改宠物的位置,可以在display下添加1234# 水平位置hOffset: 0# 垂直位置vOffset: -20详细内容可参考hexo-helper-live2d点击红心特效和爆炸特效红心特效实现效果图:实现方法:在网址输入:http://7u2ss1.com1.z0.glb.clouddn.com/love.js然后将里面的代码copy一下,新建love.js文件并且将代码复制进去,然后保存。将love.js文件放到路径/themes/next/source/js/src里面,然后打开\\themes\\next\\layout\\_layout.swig文件,在末尾(在前面引用会出现找不到的bug)添加以下代码:12<!-- 页面点击小红心 --><script type=\"text/javascript\" src=\"/js/src/love.js\"></script>爆炸特效实现效果图:实现方法:跟那个红心是差不多的,首先在themes/next/source/js/src里面建一个叫fireworks.js的文件,代码如下:1\"use strict\";function updateCoords(e){pointerX=(e.clientX||e.touches[0].clientX)-canvasEl.getBoundingClientRect().left,pointerY=e.clientY||e.touches[0].clientY-canvasEl.getBoundingClientRect().top}function setParticuleDirection(e){var t=anime.random(0,360)*Math.PI/180,a=anime.random(50,180),n=[-1,1][anime.random(0,1)]*a;return{x:e.x+n*Math.cos(t),y:e.y+n*Math.sin(t)}}function createParticule(e,t){var a={};return a.x=e,a.y=t,a.color=colors[anime.random(0,colors.length-1)],a.radius=anime.random(16,32),a.endPos=setParticuleDirection(a),a.draw=function(){ctx.beginPath(),ctx.arc(a.x,a.y,a.radius,0,2*Math.PI,!0),ctx.fillStyle=a.color,ctx.fill()},a}function createCircle(e,t){var a={};return a.x=e,a.y=t,a.color=\"#F00\",a.radius=0.1,a.alpha=0.5,a.lineWidth=6,a.draw=function(){ctx.globalAlpha=a.alpha,ctx.beginPath(),ctx.arc(a.x,a.y,a.radius,0,2*Math.PI,!0),ctx.lineWidth=a.lineWidth,ctx.strokeStyle=a.color,ctx.stroke(),ctx.globalAlpha=1},a}function renderParticule(e){for(var t=0;t<e.animatables.length;t++){e.animatables[t].target.draw()}}function animateParticules(e,t){for(var a=createCircle(e,t),n=[],i=0;i<numberOfParticules;i++){n.push(createParticule(e,t))}anime.timeline().add({targets:n,x:function(e){return e.endPos.x},y:function(e){return e.endPos.y},radius:0.1,duration:anime.random(1200,1800),easing:\"easeOutExpo\",update:renderParticule}).add({targets:a,radius:anime.random(80,160),lineWidth:0,alpha:{value:0,easing:\"linear\",duration:anime.random(600,800)},duration:anime.random(1200,1800),easing:\"easeOutExpo\",update:renderParticule,offset:0})}function debounce(e,t){var a;return function(){var n=this,i=arguments;clearTimeout(a),a=setTimeout(function(){e.apply(n,i)},t)}}var canvasEl=document.querySelector(\".fireworks\");if(canvasEl){var ctx=canvasEl.getContext(\"2d\"),numberOfParticules=30,pointerX=0,pointerY=0,tap=\"mousedown\",colors=[\"#FF1461\",\"#18FF92\",\"#5A87FF\",\"#FBF38C\"],setCanvasSize=debounce(function(){canvasEl.width=2*window.innerWidth,canvasEl.height=2*window.innerHeight,canvasEl.style.width=window.innerWidth+\"px\",canvasEl.style.height=window.innerHeight+\"px\",canvasEl.getContext(\"2d\").scale(2,2)},500),render=anime({duration:1/0,update:function(){ctx.clearRect(0,0,canvasEl.width,canvasEl.height)}});document.addEventListener(tap,function(e){\"sidebar\"!==e.target.id&&\"toggle-sidebar\"!==e.target.id&&\"A\"!==e.target.nodeName&&\"IMG\"!==e.target.nodeName&&(render.play(),updateCoords(e),animateParticules(pointerX,pointerY))},!1),setCanvasSize(),window.addEventListener(\"resize\",setCanvasSize,!1)}\"use strict\";function updateCoords(e){pointerX=(e.clientX||e.touches[0].clientX)-canvasEl.getBoundingClientRect().left,pointerY=e.clientY||e.touches[0].clientY-canvasEl.getBoundingClientRect().top}function setParticuleDirection(e){var t=anime.random(0,360)*Math.PI/180,a=anime.random(50,180),n=[-1,1][anime.random(0,1)]*a;return{x:e.x+n*Math.cos(t),y:e.y+n*Math.sin(t)}}function createParticule(e,t){var a={};return a.x=e,a.y=t,a.color=colors[anime.random(0,colors.length-1)],a.radius=anime.random(16,32),a.endPos=setParticuleDirection(a),a.draw=function(){ctx.beginPath(),ctx.arc(a.x,a.y,a.radius,0,2*Math.PI,!0),ctx.fillStyle=a.color,ctx.fill()},a}function createCircle(e,t){var a={};return a.x=e,a.y=t,a.color=\"#F00\",a.radius=0.1,a.alpha=0.5,a.lineWidth=6,a.draw=function(){ctx.globalAlpha=a.alpha,ctx.beginPath(),ctx.arc(a.x,a.y,a.radius,0,2*Math.PI,!0),ctx.lineWidth=a.lineWidth,ctx.strokeStyle=a.color,ctx.stroke(),ctx.globalAlpha=1},a}function renderParticule(e){for(var t=0;t<e.animatables.length;t++){e.animatables[t].target.draw()}}function animateParticules(e,t){for(var a=createCircle(e,t),n=[],i=0;i<numberOfParticules;i++){n.push(createParticule(e,t))}anime.timeline().add({targets:n,x:function(e){return e.endPos.x},y:function(e){return e.endPos.y},radius:0.1,duration:anime.random(1200,1800),easing:\"easeOutExpo\",update:renderParticule}).add({targets:a,radius:anime.random(80,160),lineWidth:0,alpha:{value:0,easing:\"linear\",duration:anime.random(600,800)},duration:anime.random(1200,1800),easing:\"easeOutExpo\",update:renderParticule,offset:0})}function debounce(e,t){var a;return function(){var n=this,i=arguments;clearTimeout(a),a=setTimeout(function(){e.apply(n,i)},t)}}var canvasEl=document.querySelector(\".fireworks\");if(canvasEl){var ctx=canvasEl.getContext(\"2d\"),numberOfParticules=30,pointerX=0,pointerY=0,tap=\"mousedown\",colors=[\"#FF1461\",\"#18FF92\",\"#5A87FF\",\"#FBF38C\"],setCanvasSize=debounce(function(){canvasEl.width=2*window.innerWidth,canvasEl.height=2*window.innerHeight,canvasEl.style.width=window.innerWidth+\"px\",canvasEl.style.height=window.innerHeight+\"px\",canvasEl.getContext(\"2d\").scale(2,2)},500),render=anime({duration:1/0,update:function(){ctx.clearRect(0,0,canvasEl.width,canvasEl.height)}});document.addEventListener(tap,function(e){\"sidebar\"!==e.target.id&&\"toggle-sidebar\"!==e.target.id&&\"A\"!==e.target.nodeName&&\"IMG\"!==e.target.nodeName&&(render.play(),updateCoords(e),animateParticules(pointerX,pointerY))},!1),setCanvasSize(),window.addEventListener(\"resize\",setCanvasSize,!1)};打开themes/next/layout/_layout.swig,在</body>上面写下如下代码:12345{% if theme.fireworks %} <canvas class=\"fireworks\" style=\"position: fixed;left: 0;top: 0;z-index: 1; pointer-events: none;\" ></canvas> <script type=\"text/javascript\" src=\"//cdn.bootcss.com/animejs/2.2.0/anime.min.js\"></script> <script type=\"text/javascript\" src=\"/js/src/fireworks.js\"></script>{% endif %}打开主题配置文件,在里面最后写下:12# Fireworksfireworks: true文章加密访问打开themes->next->layout->_partials->head.swig文件,在以下位置插入这样一段代码:代码如下:12345678910<script> (function(){ if('{{ page.password }}'){ if (prompt('请输入文章密码') !== '{{ page.password }}'){ alert('密码错误!'); history.back(); } } })();</script>然后在文章上写成类似这样:文章置顶打开 Hexo 站点下 node_modules/hexo-generator-index/lib/generator.js 文件。代码全部替换为:(next 5.1以后主题已自带此功能)12345678910111213141516171819202122232425262728'use strict';var pagination = require('hexo-pagination');module.exports = function(locals){ var config = this.config; var posts = locals.posts; posts.data = posts.data.sort(function(a, b) { if(a.top && b.top) { // 两篇文章top都有定义 if(a.top == b.top) return b.date - a.date; // 若top值一样则按照文章日期降序排 else return b.top - a.top; // 否则按照top值降序排 } else if(a.top && !b.top) { // 以下是只有一篇文章top有定义,那么将有top的排在前面(这里用异或操作居然不行233) return -1; } else if(!a.top && b.top) { return 1; } else return b.date - a.date; // 都没定义按照文章日期降序排 }); var paginationDir = config.pagination_dir || 'page'; return pagination('', posts, { perPage: config.index_generator.per_page, layout: ['index', 'archive'], format: paginationDir + '/%d/', data: { __index: true } });};打开文章添加top字段,设置数值,数值越大文章越靠前:1234567---layout: layouttitle: 标签1date: 2017-08-18 15:41:18tags: 标签1top: 100---域名更换1.申请域名我在万网购买的域名,地址:https://wanwang.aliyun.com/domain/com?spm=5176.8142029.388261.137.LoKzy7我这里是.cn结尾的域名,一年39大洋anoyer.cn2.解析域名添加如下的解析得到域名之后,到控制台进行解析控制台->域名与网站(万网)->域名->域名列表->解析在阿里云控制台,设置主机记录www,记录类型为A,记录值是IP103.210.21.11。其中103.210.21.11是Github Pages服务器指定的IP地址,访问该IP地址即表示访问Coding Pages。在阿里云控制台,设置主机记录@,记录类型为CNAME,记录值是anoyer.coding.me。表示将https://anoyer.cn这个主域名映射anoyer.coding.me如何知道知道的 Coding Pages IP在命令提示符中输入ping anoyer.cn成功之后:3.配置在博客的source文件夹下建立一个CNAME的文件内容写入你的域名信息,比如我这里是anoyer.cn发布到Coding即可4.Coding 配置进入Coding 项目的Pages服务,进入设置把刚解析的域名绑定上去。到这里就OK了。插入网易云音乐在知道了页面的结构之后,你就可以将你的播放器添加在页面的任意位置,开始我是放在了首页,然后发现一上来就自动播放太吵了,于是就放在了侧边栏,想要听得朋友可以手动点击播放,我们可以直接在网易云音乐中搜索我们想要插入的音乐,然后点击生成外链播放器然后可以根据你得设置生成相应的html代码,将获得的html代码插入到你想要插入的位置即可我放在了layout/_macro/sidebar.swig 文件下1234<div id=\"music163player\"> <iframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=280 height=86 src=\"//music.163.com/outchain/player?type=2&id=38358214&auto=0&height=66\"> </iframe></div>阅读全文在文章中使用< !--more--> 手动进行截断这种方法可以根据文章的内容,自己在合适的位置添加 < !--more--> 标签,使用灵活,也是Hexo推荐的方法。在线联系 之前有访问过一些大佬的个人博客,里面有个在线联系功能,看着不错,所以也试着在自己的站点上接入了此功能。注册首先在DaoVoice注册个账号,点击->邀请码是2e5d695d。完成后,会得到一个app_id,后面会用到:修改head.swig修改/themes/next/layout/_partials/head.swig文件,添加内容如下:123456789{% if theme.daovoice %} <script> (function(i,s,o,g,r,a,m){i["DaoVoiceObject"]=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;a.charset="utf-8";m.parentNode.insertBefore(a,m)})(window,document,"script",('https:' == document.location.protocol ? 'https:' : 'http:') + "//widget.daovoice.io/widget/0f81ff2f.js","daovoice") daovoice('init', { app_id: "{{theme.daovoice_app_id}}" }); daovoice('update'); </script>{% endif %}位置贴图:主题配置文件在_config.yml文件中添加内容:123# Online contactdaovoice: truedaovoice_app_id: # 这里填你刚才获得的 app_id聊天窗口配置附上我的聊天窗口的颜色、位置等设置信息:至此,网页的在线联系功能已经完成,重新hexo g,hexo d上传GitHub后,页面上就能看到效果了。就比如说你现在往右下角看看(~ ̄▽ ̄)~ ,欢迎撩我(滑稽)。打赏因为next主题自带打赏功能,所以我们只需要在next的主题配置文件中找到如下代码,image文件夹是我在blog/source下面建立的文件夹,然后把你的微信及支付宝收钱码图片拉进去,修改名字为wechatreward.png和alipayreward.png123reward_comment: 坚持原创技术分享,您的支持将鼓励我继续创作!wechatpay: /image/wechatreward.pngalipay: /image/alipayreward.png修改文章间分割线打开 themes/next/source/css/_common/components/post/post-eof.styl ,修改:12345678910.posts-expand { .post-eof { display: block; // margin: $post-eof-margin-top auto $post-eof-margin-bottom; width: 0%; //分割线长度 height: 0px; // 分割线高度 background: $grey-light; text-align: center; }}参考博客:1.https://www.jianshu.com/p/f054333ac9e62.https://blog.csdn.net/qsdsn/article/details/779466773.https://www.aisun.org/2017/10/hexo-next+dingzhi/","categories":[{"name":"Hexo","slug":"Hexo","permalink":"https://anoyer.cn/categories/Hexo/"}],"tags":[{"name":"Hexo","slug":"Hexo","permalink":"https://anoyer.cn/tags/Hexo/"},{"name":"Next","slug":"Next","permalink":"https://anoyer.cn/tags/Next/"}]},{"title":"置顶文章示例","slug":"article-top","date":"2018-11-22T03:35:22.000Z","updated":"2019-01-24T04:38:32.876Z","comments":true,"path":"article/article-top.html","link":"","permalink":"https://anoyer.cn/article/article-top.html","excerpt":"","text":"【前言】这是置顶文章的示例。在<!-- more -->标签前的内容都会显示在首页的文章列表的摘录中,内容不能太多,建议在一至两段后即可添加more标签。置顶文章的顶部参数设置img: 设置了首页列表左侧显示的图片,使用默认的置顶图片即可。如果需要替换,请进入博客根目录下的source\\img文件夹下进行替换。topimg: 设置是否显示右侧的置顶标志,true为显示,false为不显示。top: 设置置顶顺序,当top的值越大时,文章会显示在首页列表最上方。若无特殊需求,建议不要在其他文章中设置top参数,以免导致文章顺序排列错误。置顶文章的内容建议可将某篇特别的文章进行置顶展示或者专门用来编辑各种公告、通知、留言等内容。","categories":[],"tags":[]},{"title":"HDU-3374-String Problem(最大与最小表示法+kmp求循环节)","slug":"HDU - 3374 - String Problem(最大与最小表示法+kmp求循环节)","date":"2018-11-17T09:06:51.000Z","updated":"2019-01-24T04:39:47.216Z","comments":true,"path":"article/HDU - 3374 - String Problem(最大与最小表示法+kmp求循环节).html","link":"","permalink":"https://anoyer.cn/article/HDU - 3374 - String Problem(最大与最小表示法+kmp求循环节).html","excerpt":"","text":"博主链接HDU - 3374 - String Problem题意:给你一个字符串,问这个字符串经过移动后的字典序最小的字符串的首字符位置和字典序最大的字符串的首字符的位置,和能出现多少次最小字典序的字符串和最大字典序的字符串题解:利用最小表示法与最大表示法O(n)复杂度求出最小字典序和最大字典序串出现位置,然后利用kmp求出next,利用next数组性质求出循环节次数,因为最小和最大字典序串出现次数等于循环节次数(这个关系可以脑补下)代码:1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e6+20;const int mod=1e9+7;char s[maxn];int len;int nex[maxn];void GetNex(){ memset(nex,0,sizeof(nex)); int j=-1; for(int i=0;s[i];i++){ while(s[i]!=s[j+1]&&j!=-1)j=nex[j]; if(s[i]==s[j+1]&&i!=0)j++; nex[i]=j; }}int GetMin(){ int i=0,j=1,k=0; while(i<len&&j<len&&k<len){ int t=s[(i+k)%len]-s[(j+k)%len]; if(t==0)k++; else{ if(t>0)i=i+k+1; else j=j+k+1; if(i==j)j++; k=0; } } return min(i,j);}int GetMax(){ int i=0,j=1,k=0; while(i<len&&j<len&&k<len){ int t=s[(i+k)%len]-s[(j+k)%len]; if(t==0)k++; else{ if(t>0)j=j+k+1; else i=i+k+1; if(i==j)j++; k=0; } } return i<j?i:j;}int main(){ while(scanf(\"%s\",s)!=EOF){ len=strlen(s); int sum=0; int mi=GetMin();//获取最小表示下标 int mx=GetMax();//获取最大表示下标 GetNex(); if(len%(len-nex[len-1]-1)==0)sum=len/(len-nex[len-1]-1); else sum=1; printf(\"%d %d %d %d\\n\",mi+1,sum,mx+1,sum); } return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"HDU","slug":"HDU","permalink":"https://anoyer.cn/tags/HDU/"},{"name":"KMP","slug":"KMP","permalink":"https://anoyer.cn/tags/KMP/"},{"name":"字符串题解","slug":"字符串题解","permalink":"https://anoyer.cn/tags/字符串题解/"}]},{"title":"最小表示法与最大表示法","slug":"最小表示法与最大表示法(O(n))","date":"2018-11-17T09:03:50.000Z","updated":"2019-01-24T04:43:42.576Z","comments":true,"path":"article/最小表示法与最大表示法(O(n)).html","link":"","permalink":"https://anoyer.cn/article/最小表示法与最大表示法(O(n)).html","excerpt":"","text":"博主CSDN最小表示法伪代码:最小表示法的算法思路是维护两个指针i,j。令i=0,j=1如果S[i] > S[j] i=j, j=i+1如果S[i] < S[j] j++如果S[i]==S[j] 设指针k,分别从i和j位置向下比较,直到S[i] != S[j] 如果S[i+k] > S[j+k] i=i+k 否则j++返回i和j的小者模版:123456789101112131415161718192021222324252627282930313233343536373839#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e6+7;const int mod=1e9+7;char s[maxn];int GetMin(){ int i=0,j=1,k=0; while(i<len&&j<len&&k<len){ int t=s[(i+k)%len]-s[(j+k)%len]; if(t==0)k++; else{ if(t>0)i=i+k+1; else j=j+k+1; if(i==j)j++; k=0; } } return min(i,j);}int GetMax(){ int i=0,j=1,k=0; while(i<len&&j<len&&k<len){ int t=s[(i+k)%len]-s[(j+k)%len]; if(t==0)k++; else{ if(t>0)j=j+k+1; else i=i+k+1; if(i==j)j++; k=0; } } return i<j?i:j;}int main(){ scanf(\"%s\",s); return 0;}","categories":[{"name":"字符串模板","slug":"字符串模板","permalink":"https://anoyer.cn/categories/字符串模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"河南农业大学热身赛标程","slug":"河南农业大学热身赛标程","date":"2018-11-13T05:13:47.000Z","updated":"2019-01-24T04:44:28.940Z","comments":true,"path":"article/河南农业大学热身赛标程.html","link":"","permalink":"https://anoyer.cn/article/河南农业大学热身赛标程.html","excerpt":"","text":"河南农业大学热身赛标程博主CSDNA.宅宅的排位赛1234567891011121314151617181920212223#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e3 + 10;const int mod = 1e9 + 7;int main(){ int t; scanf(\"%d\", &t); while (t--){ int a, suma = 0, sumb = 0; for (int i = 0; i <= 13; i++){ //suma记录A1~N1的和 scanf(\"%d\", &a); suma += a; } for (int i = 0; i <= 13; i++){ //sumb记录A2~N2的和 scanf(\"%d\", &a); sumb += a; } printf(\"%d\\n\", suma - sumb); } return 0;}B.冒泡排序12345678910111213141516171819202122232425#include<stdio.h>#include<bits/stdc++.h>using namespace std;int a[120];int main(){ int t; scanf(\"%d\", &t); while (t--){ int n, min_ = 9999,id=0; scanf(\"%d\", &n); for (int i = 0; i < n; i++)scanf(\"%d\", &a[i]); //sort(a, a + n);//解法一:调用库函数快排函数 //解法二:手撸冒泡排序 for (int i = 0; i < n; i++){ min_ =a[i]; id = i; for (int j = i; j < n; j++){ if (a[j] <= min_)min_ = a[j], id = j; } swap(a[i], a[id]); //把为排序的最小值换到当前i位 } for (int i = 0; i < n; i++)printf(\"%d\\n\", a[i]); } return 0;}C.小刘数字母123456789101112131415161718192021#include<stdio.h>#include<bits/stdc++.h> //万能头文件using namespace std;char s[10050];int main(){ int t; char ch; scanf(\"%d\",&t); while(t--){ scanf(\"%s\",s); getchar(); //接收空格 scanf(\"%c\",&ch); int cnt=0; //记录出现次数 int len=strlen(s); //求出输入串长度 for(int i=0;i<len;i++){ if(s[i]==ch)cnt++; //如果ch出现就cnt++ } printf(\"%d\\n\",cnt); } return 0;}D.HH的LCM12345678910111213141516171819202122232425#include<stdio.h>#include<bits/stdc++.h>using namespace std;int main(){ int t; scanf(\"%d\",&t); //GCD解法 while(t--){ int a,b; scanf(\"%d%d\",&a,&b); printf(\"%d\\n\",a*b/__gcd(a,b)); //a,b的最小公倍数=a*b/(a,b的最大公因数) } // 暴力解法 /*while(t--){ int a,b; scanf(\"%d%d\",&a,&b); for(int i=1;i<=a*b;i++){ //a*b肯定能被整除a,b,所以LCM不大于a*b if(i%a==0&&i%b==0){ //第一个能被整除的a,b的便是他们的最小公倍数 printf(\"%d\\n\",i); break; } } }*/ return 0;}E.斐波那契数123456789101112131415161718192021222324252627282930#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e3 + 10;const int mod = 1e9 + 7;int Fib[maxn];int main(){ int cnt = 1; Fib[0] = 0; Fib[1] = 1; for (int i = 2; Fib[i - 1] <= 100000; i++, cnt++){ //暴力打表求出所有小于100000的斐波那契数 Fib[i] = Fib[i - 1] + Fib[i - 2]; } int t; scanf(\"%d\", &t); while (t--){ int n, ans = 0; //ans用来记录数量 scanf(\"%d\", &n); for (int i = 26; i >= 1; i--){ //对于n从最大的Fib数列往前扫, if (n >= Fib[i])n -= Fib[i], ans++; //如果发现不大于n的Fib数,就用n-Fib[i],ans++ } /* 贪心证明:因为对于任何n,比n小的且最大的Fib[i]一定满足 Fib[i]<n<2*Fib[i] 因为 Fib[i-1]+Fib[i]=Fib[i+1]<2*Fib[i] */ printf(\"%d\\n\", ans); } return 0;}F.辉辉学长爱喝水123456789101112131415161718#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e3 + 10;const int mod = 1e9 + 7;int main(){ double n, m; scanf(\"%lf%lf\", &n, &m); int a = ceil(n / (m * 2)); if (n == 0)printf(\"0\\n\"); // 需要多少步 向上取整 else if (m == 0)printf(\"No answer!\\n\"); else if(n-a*m<=0){ printf(\"1\\n\"); } else printf(\"%d\\n\", a + 1); return 0;}G.打麻将123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657#include<stdio.h>#include<bits/stdc++.h>using namespace std;bool ok=0; //胡牌标记bool vis[20]; //标记这张牌有没有被使用char a[20];int d[20][5];int ttt[11];void dfs(int cur,char *str,int cnt){ if(cur>12)return; //因为组成刻子和顺子的牌需要12张,如果超过了就return if(cur==12&&cnt==4){ //如果刻子和顺子用了12张牌且刻子和顺子数一共4,则进一步判断另外两张牌是不是对子 int a=0,b=0; for(int i=1;i<=14;i++)if(!vis[i]){vis[i]=true,a=i;break;} //遍历出剩余第一张牌 for(int i=1;i<=14;i++)if(!vis[i]){vis[i]=true,b=i;break;} //遍历出剩余第二张牌 if(str[a]==str[b]&&(str[a]!=' '&&str[b]!=' ')) //如果str[a]等于str[b]能胡牌 ,ok=true ok=true; vis[a]=vis[b]=false; return ; } for(int i=1;i<=12&&!ok;i++) //dfs遍历这14张牌所有组合情况 if(!vis[i]) for(int j=i+1;j<=13&&!ok;j++) if(!vis[j]) for(int k=j+1;k<=14&&!ok;k++){ //挑3个牌str[i],str[j],str[k] if(!vis[k]) if((str[i]==str[j]&&str[j]==str[k])||(str[i]+1==str[j]&&str[j]+1==str[k])){ //看能否成顺子或刻子 vis[i]=vis[j]=vis[k]=true; //把选的牌标记为已用 dfs(cur+3,str,cnt+1);//成了的话,cur+3,cur代表选的牌数,cnt+1,cnt代表现在顺子跟刻子的总和 vis[i]=vis[j]=vis[k]=false; //把牌标记为未用 } }}int main(){ int t; scanf(\"%d\",&t); while(t--){ scanf(\"%s\",&a[1]); //cnt++; int tt_=0; ok=false; memset(ttt,0,sizeof(ttt)); for(int i=1;i<=14;i++){ //判断是否是合法牌 ttt[a[i]-'0']++; if(ttt[a[i]-'0']>4){ printf(\"The data is error!\\n\"); tt_=1; break; } } if(tt_)continue; sort(a+1,a+15); //把牌从小到大排好序 dfs(0,a,0); if(!ok)printf(\"NO\\n\"); else printf(\"YES\\n\"); } return 0;}","categories":[{"name":"农大训练赛题解","slug":"农大训练赛题解","permalink":"https://anoyer.cn/categories/农大训练赛题解/"}],"tags":[{"name":"河南农业大学训练赛题解","slug":"河南农业大学训练赛题解","permalink":"https://anoyer.cn/tags/河南农业大学训练赛题解/"}]},{"title":"河南农业大学训练赛二标程","slug":"河南农业大学测试赛二标程","date":"2018-11-10T14:01:51.000Z","updated":"2019-01-24T04:44:08.649Z","comments":true,"path":"article/河南农业大学测试赛二标程.html","link":"","permalink":"https://anoyer.cn/article/河南农业大学测试赛二标程.html","excerpt":"","text":"河南农业大学测试赛二标程博主CSDNA.判断闰年1234567891011121314#include<cstdio> int main(){ int t; scanf(\"%d\",&t); while(t--){ int n; scanf(\"%d\",&n); if((n%4==0&&n%100!=0)||(n%400==0)) printf(\"YES\\n\"); else printf(\"NO\\n\"); } return 0;}B.复读机1234567891011121314151617181920212223242526272829#include <stdio.h>#include <bits/stdc++.h>using namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;int main(){#ifdef LOCAL freopen(\"C:/input.txt\", \"r\", stdin);#endif int T; cin >> T; while (T--) { int N; cin >> N; char c, last = 0; getchar(); for (int i = 0; i < N; i++) { c = getchar(); if (c != last) putchar(c), last = c; } cout << endl; } return 0;}C.hui姐识数1234567891011121314151617181920212223242526#include<stdio.h>#include<bits/stdc++.h>using namespace std;const int maxn = 1e3 + 7;char Num[20][100] = { \"Ling\", \"Yi\", \"Er\", \"San\", \"Si\", \"Wu\", \"Liu\", \"Qi\", \"Ba\", \"Jiu\" };char Unit[10][100] = { \"\", \"Shi\", \"Bai\", \"Qian\",\"Wan\" };int main(){ int t; scanf(\"%d\", &t); while (t--){ int n,k=4,flag=0,flag0=0; scanf(\"%d\", &n); if (n == 0){ printf(\"%s\\n\", Num[0]); continue; } for (int i = 10000; k>=0; i /= 10,k--){ if (n / i){ if (flag&&flag0){ printf(\"%s\", Num[0]); flag = 0; } printf(\"%s%s\", Num[n / i], Unit[k]); n %= i; flag =1; flag0 = 0; } else if(flag)flag0 = 1; } puts(\"\"); }}","categories":[{"name":"农大训练赛题解","slug":"农大训练赛题解","permalink":"https://anoyer.cn/categories/农大训练赛题解/"}],"tags":[{"name":"河南农业大学训练赛题解","slug":"河南农业大学训练赛题解","permalink":"https://anoyer.cn/tags/河南农业大学训练赛题解/"}]},{"title":"河南农业大学训练赛标程","slug":"河南农业大学测试赛标程","date":"2018-11-08T14:32:27.000Z","updated":"2019-01-24T04:44:19.520Z","comments":true,"path":"article/河南农业大学测试赛标程.html","link":"","permalink":"https://anoyer.cn/article/河南农业大学测试赛标程.html","excerpt":"","text":"河南农业大学测试赛标程博主CSDNA.最大最小值12345678910111213141516171819202122#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e9 + 10;const int mod = 1e9 + 7;int main(){ int t; scanf(\"%d\", &t); while (t--){ int n; scanf(\"%d\", &n); ll a, min_ = maxn, max_ = -maxn; for (int i = 0; i < n; i++){ scanf(\"%lld\", &a); if (a>max_)max_ = a; if (a < min_)min_ = a; } printf(\"%lld %lld\\n\", max_, min_); } return 0;}B.找众数12345678910111213141516171819202122232425262728#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e9 + 10;const int mod = 1e9 + 7;int num[120];int main(){ int t; scanf(\"%d\", &t); while (t--){ int n,a; memset(num, 0, sizeof(num)); scanf(\"%d\", &n); for (int i = 0; i < n; i++){ scanf(\"%d\", &a); num[a]++; } int b = 0; a = 0; for (int i = 0; i <= 100; i++){ if (num[i] >= a)b = i,a=num[i]; } printf(\"%d\\n\", b); } return 0;}C.买!买!买!123456789101112131415161718192021222324252627#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e3 + 10;const int mod = 1e9 + 7;int a[] = { 15, 25};int dp[maxn];int main(){ int t; scanf(\"%d\", &t); while (t--){ int n; scanf(\"%d\", &n); memset(dp, 0, sizeof(dp)); dp[0] = 1; for (int i = 10; i <= n * 10; i+=5){ for (int j = 0; j < 2; j++){ if (i >= a[j]){ dp[i] += dp[i - a[j]]; } } } printf(\"%d\\n\", dp[n * 10]); } return 0;}","categories":[{"name":"农大训练赛题解","slug":"农大训练赛题解","permalink":"https://anoyer.cn/categories/农大训练赛题解/"}],"tags":[{"name":"河南农业大学训练赛题解","slug":"河南农业大学训练赛题解","permalink":"https://anoyer.cn/tags/河南农业大学训练赛题解/"}]},{"title":"线性基模板","slug":"线性基模板","date":"2018-10-20T14:52:30.000Z","updated":"2019-01-24T04:46:38.104Z","comments":true,"path":"article/线性基模板.html","link":"","permalink":"https://anoyer.cn/article/线性基模板.html","excerpt":"","text":"博主CSDN12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788#include<stdio.h>#include<bits/stdc++.h>using namespace std;typedef long long int ll;const int maxn=1e5+7;const int mod=1e9+7;struct Linear_Basis{ ll b[63],nb[63],tot; //b为线性基 nb用来求第K小异或值 tot为nb元素个数 bool flag=false; void Init(){ //初始化 tot=0; flag=false; memset(b,0,sizeof(b)); memset(nb,0,sizeof(nb)); } void Ins(ll x){ //插入 for(int i=62;i>=0;i--){ if(x&(1ll<<i)){ if(!b[i]){ b[i]=x; return; } x^=b[i]; } } flag=true; return; } bool Fin(ll x){ //验证存在性 if(x==0&&b[0])return 1; for(int i=62;i>=1;i--){ int j=i-1; if(x&(1<<j)){ x^=b[i]; if(!x)return 1; } } return 0; } ll Max(ll x){ //求最大值 ll res=x; for(int i=62;i>=0;i--){ res=max(res,res^b[i]); } return res; } ll Min(ll x){ //求最小值 ll res=x; for(int i=0;i<=62;i++){ if(b[i])res^=b[i]; } return res; } ll Rebuild(){ //第K大 for(int i=62;i>=0;i--){ if(b[i]==0)continue; for(int j=i-1;j>=0;j--){ if(b[j]==0)continue; if(b[i]&(1ll<<j))b[i]^=b[j]; } } for(int i=0;i<=62;i++){ if(b[i])nb[tot++]=b[i]; } } ll Kth_Max(ll k){ if(flag)k--; //??? ll res=0; if(k==0)return 0; if(k>=(1ll<<tot))return -1; for(int i=62;i>=0;i--){ if(k&(1ll<<i))res^=nb[i]; } return res; }}LB;void merge(Linear_Basis &a,Linear_Basis &b){//a和b都变成a+b for(int i=31;i>=1;i--){ if(b.b[i]==0)continue; a.Ins(b.b[i]); } b=a;}int main(){ int n; scanf(\"%d\",&n); return 0;}","categories":[{"name":"数论模板","slug":"数论模板","permalink":"https://anoyer.cn/categories/数论模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"Codeforces-Round-515-(Div.3)--C.BooksQueries","slug":"Codeforces-Round-515-Div-3-C-Books-Queries","date":"2018-10-12T17:10:33.000Z","updated":"2019-01-24T04:39:36.131Z","comments":true,"path":"article/Codeforces-Round-515-Div-3-C-Books-Queries.html","link":"","permalink":"https://anoyer.cn/article/Codeforces-Round-515-Div-3-C-Books-Queries.html","excerpt":"","text":"博主链接题目题意:给Q次操作,可以往书架右边边缘加书或者左边边缘加书或者查询一本书里边缘的最短距离题解:用两个数组记录一本书是第几本放右边或左边的书,这样就可以保证如果这本书是当时通过放左边进入书架则距离为 ==min(L + b[id]-1,R - b[id])== ,如果通过右边则是 ==min(R + a[id]-1, L - a[id])== ,可以自己脑补下代码:123456789101112131415161718192021222324252627282930313233343536373839#include<stdio.h>#include<bits/stdc++.h>#define met(a) memset(a,0,sizeof(a))#define fup(i,a,n,b) for(int i=a;i<n;i+=b)#define fow(j,a,n,b) for(int j=a;j>0;j-=b)#define ll long long intconst ll LINF=0x3f3f3f3f3f3f3f;#define MOD(x) (x)%modusing namespace std;const int maxn = 1e6 + 10;const int mod = 1e9 + 7;int a[maxn],b[maxn];int main(int argc, char *argv[]) { int q,d; char ch[10]; int id,L=0, R=0; int cnt = 0; scanf(\"%d\", &q); while (q--) { cin >> ch >> id; if (ch[0] == 'L') { ++cnt; a[id] = ++L; } else if (ch[0] == 'R') { ++cnt; b[id] = ++R; } else { if (a[id] == 0) { printf(\"%d\\n\", min(L + b[id]-1,R - b[id])); } else { printf(\"%d\\n\", min(R + a[id]-1, L - a[id])); } } }}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"codeforces","slug":"codeforces","permalink":"https://anoyer.cn/tags/codeforces/"},{"name":"思维题","slug":"思维题","permalink":"https://anoyer.cn/tags/思维题/"}]},{"title":"Codeforces-Round-513-D-Social-Circles","slug":"Codeforces-Round-513-C-Social-Circles","date":"2018-10-04T11:12:27.000Z","updated":"2019-01-24T04:47:20.242Z","comments":true,"path":"article/Codeforces-Round-513-C-Social-Circles.html","link":"","permalink":"https://anoyer.cn/article/Codeforces-Round-513-C-Social-Circles.html","excerpt":"","text":"博主博客题目链接题意:有n个人,及每个人坐位置时左右需要有多少空椅子,求所有人入座至少需要多少椅子题解:利用贪心,将所有人的右边需要空的椅子数存在a数组里,右边需要空的椅子数存在b数组里,然后排序,将对应下标的max(a[i],b[i])加起来再加上n,就是答案,因为大的和大的一合一起可以保证省去椅子最大123456789101112131415161718192021222324#include<stdio.h>#include<bits/stdc++.h>#define met(a) memset(a,0,sizeof(a))#define fup(i,a,n,b) for(int i=a;i<n;i+=b)#define fow(j,a,n,b) for(int j=a;j>0;j-=b)#define MOD(x) (x)%modusing namespace std;const int maxn = 1e5 + 10;const int mod = 1e9 + 7;typedef long long ll;int a[maxn], b[maxn];int main(int argc, char *argv[]) { int n; scanf(\"%d\", &n); for (int i = 0; i < n; i++)scanf(\"%d%d\", &a[i], &b[i]); sort(a, a + n); sort(b, b + n); ll ans = 0; for (int i = n - 1; i >= 0; i--) { ans += max(a[i], b[i]); } printf(\"%lld\\n\", ans+n); return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"codeforces","slug":"codeforces","permalink":"https://anoyer.cn/tags/codeforces/"},{"name":"思维题","slug":"思维题","permalink":"https://anoyer.cn/tags/思维题/"}]},{"title":"表达式求值(逆波兰)","slug":"表达式求值","date":"2018-10-03T16:19:05.000Z","updated":"2019-01-24T04:46:53.570Z","comments":true,"path":"article/表达式求值.html","link":"","permalink":"https://anoyer.cn/article/表达式求值.html","excerpt":"","text":"博主CSDN123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596#include<stdio.h>#include<bits/stdc++.h>using namespace std;const int maxn = 1e3 + 10;typedef long long ll;char s[maxn];int cmp(char ch){ switch (ch){ case '+': case '-':return 1; case '*': case '/':return 2; default:return 0; }}string ss = \"\";void ToSuffix(){ stack<char>Se; double ans = 0; Se.push('#'); int len = strlen(s); for (int i = 0; i<len; i++){ if (s[i] >= '0'&&s[i] <= '9'){ ss += s[i++]; while (s[i] >= '0'&&s[i] <= '9'){ ss += s[i++]; } ss += ' '; } if (s[i] == '(')Se.push(s[i]); else if (s[i] == ')'){ while (Se.top() != '('){ ss += Se.top(); ss += ' '; Se.pop(); } Se.pop(); } else if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/'){ while (cmp(Se.top()) >= cmp(s[i])){ ss += Se.top(); ss += ' '; Se.pop(); } Se.push(s[i]); } } while (Se.top() != '#'){ ss += Se.top(); ss += ' '; Se.pop(); } Se.pop();}double Solve(){ stack<double>num; int i = 0; double x = 0, y = 0,ans=0; for (int i = 0; ss[i]; i++){ if (ss[i] >= '0'&&ss[i] <= '9'){ ans = ss[i++] - '0'; while (ss[i] >= '0'&&ss[i] <= '9'){ ans =ans*10+ ss[i++]-'0'; } num.push(ans); ans = 0; } else if (ss[i] == ' '); else{ x = num.top(); num.pop(); y = num.top(); num.pop(); if (ss[i] == '+')num.push(x + y); else if (ss[i] == '-')num.push(y - x); else if (ss[i] == '*')num.push(x * y); else if (ss[i] == '/')num.push(y / x); } } x = num.top(); num.pop(); return x;}int main(){ freopen(\"C:/Users/Administrator/Desktop/input.txt\", \"r\", stdin); int t; scanf(\"%d\", &t); while (t--){ scanf(\"%s\", s); ss = \"\"; ToSuffix(); printf(\"%.2f\\n\",Solve()); } return 0;}","categories":[{"name":"数据结构模板","slug":"数据结构模板","permalink":"https://anoyer.cn/categories/数据结构模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"},{"name":"逆波兰","slug":"逆波兰","permalink":"https://anoyer.cn/tags/逆波兰/"}]},{"title":"对数器模板","slug":"对数器模版","date":"2018-10-03T16:19:05.000Z","updated":"2019-01-24T04:43:26.333Z","comments":true,"path":"article/对数器模版.html","link":"","permalink":"https://anoyer.cn/article/对数器模版.html","excerpt":"","text":"博主CSDN123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687//需要建立主路径 和主路径下sample/ 保证程序文件存在#include <bits/stdc++.h>using namespace std;string mpat(\"D:/dsq/\"); //主路径 注意末尾跟'/'!!!! linuxpwd查看当前路径string an(\"A\"), bn(\"B\"); //程序名字int brek = 5; //几个错误停止 -1不停止int cmpt = 1; //编译模式void exec(const string &cmd, string &res){ char buf[1024]; FILE *fp = _popen(cmd.c_str(), \"r\"); //linux下改为popen while (fgets(buf, 1024, fp)) res.append(buf); _pclose(fp); //linux下改为pclose}void wrfile(const string &path, stringstream &ss){ string str; FILE *fp = fopen(path.c_str(), \"wb\"); while (getline(ss, str)) fprintf(fp, \"%s\\r\\n\", str.c_str()); fclose(fp);}long long d_rand(long long l, long long r){ int k = rand() % 4; long long t = rand(); for (int i = 0; i < k; i++) t = t << 16 | rand(); return l + t % (r - l + 1);}double f_rand(double l, double r){ double t = rand() / 32767.0; return l + t * (r - l);}char c_rand(const string &ch){ return ch[rand() % ch.size()];}void sample(stringstream &sout) //样例生成{}int main(){ srand(time(NULL)); rand(); if (cmpt) //编译功能 { system((\"g++ \" + mpat + an + \".cpp -o \" + mpat + an + \".exe -std=c++11\").c_str()); //C++11支持 system((\"g++ \" + mpat + bn + \".cpp -o \" + mpat + bn + \".exe -std=c++11\").c_str()); } string num, aout, bout, spat = mpat + \"sample/\"; //样例生成子路径 stringstream ss; int cnt = 0, wa = 0; for (int i = 1; i <= brek; i++) { ss.clear(), ss << i, ss >> num; remove((spat + num + \"samp.txt\").c_str()); remove((spat + num + \"ans\" + an + \".txt\").c_str()); remove((spat + num + \"ans\" + bn + \".txt\").c_str()); } while (wa < brek && cnt < 1e4) //几个错误停止 极限1W个样例 { ss.str(\"\"), ss.clear(), ss << wa + 1, ss >> num; aout.clear(), bout.clear(), ss.clear(); sample(ss); wrfile(spat + num + \"samp.txt\", ss); cout << ++cnt; exec(mpat + an + \".exe < \" + spat + num + \"samp.txt\", aout); exec(mpat + bn + \".exe < \" + spat + num + \"samp.txt\", bout); if (aout != bout) { ss.clear(), ss.str(aout); wrfile(spat + num + \"ans\" + an + \".txt\", ss); ss.clear(), ss.str(bout); wrfile(spat + num + \"ans\" + bn + \".txt\", ss); ++wa; } cout << \"\\t\" << wa << endl; } return 0;}","categories":[{"name":"对数器","slug":"对数器","permalink":"https://anoyer.cn/categories/对数器/"}],"tags":[]},{"title":"线段树模板","slug":"线段树模板","date":"2018-10-03T16:19:05.000Z","updated":"2019-01-24T04:46:41.088Z","comments":true,"path":"article/线段树模板.html","link":"","permalink":"https://anoyer.cn/article/线段树模板.html","excerpt":"","text":"博主CSDN12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697#include<stdio.h>#include<bits/stdc++.h>using namespace std;int n,p,a,b,m,x,y,ans;struct node{ int l,r,w,f;}tree[400001];inline void build(int k,int ll,int rr) {//建树 tree[k].l=ll,tree[k].r=rr; if(tree[k].l==tree[k].r){ scanf(\"%d\",&tree[k].w); return; } int m=(ll+rr)/2; build(k*2,ll,m); build(k*2+1,m+1,rr); tree[k].w=tree[k*2].w+tree[k*2+1].w;}inline void down(int k) {//标记下传 tree[k*2].f+=tree[k].f; tree[k*2+1].f+=tree[k].f; tree[k*2].w+=tree[k].f*(tree[k*2].r-tree[k*2].l+1); tree[k*2+1].w+=tree[k].f*(tree[k*2+1].r-tree[k*2+1].l+1); tree[k].f=0;}inline void ask_point(int k){//单点查询 if(tree[k].l==tree[k].r){ ans=tree[k].w; return ; } if(tree[k].f) down(k); int m=(tree[k].l+tree[k].r)/2; if(x<=m) ask_point(k*2); else ask_point(k*2+1);}inline void change_point(int k) {//单点修改 if(tree[k].l==tree[k].r){ tree[k].w+=y; return; } if(tree[k].f) down(k); int m=(tree[k].l+tree[k].r)/2; if(x<=m) change_point(k*2); else change_point(k*2+1); tree[k].w=tree[k*2].w+tree[k*2+1].w; }inline void ask_interval(int k) {//区间查询 if(tree[k].l>=a&&tree[k].r<=b) { ans+=tree[k].w; return; } if(tree[k].f) down(k); int m=(tree[k].l+tree[k].r)/2; if(a<=m) ask_interval(k*2); if(b>m) ask_interval(k*2+1);}inline void change_interval(int k) {//区间修改 if(tree[k].l>=a&&tree[k].r<=b){ tree[k].w+=(tree[k].r-tree[k].l+1)*y; tree[k].f+=y; return; } if(tree[k].f) down(k); int m=(tree[k].l+tree[k].r)/2; if(a<=m) change_interval(k*2); if(b>m) change_interval(k*2+1); tree[k].w=tree[k*2].w+tree[k*2+1].w;}int main(){ scanf(\"%d\",&n);//n个节点 build(1,1,n);//建树 scanf(\"%d\",&m);//m种操作 for(int i=1;i<=m;i++){ scanf(\"%d\",&p); ans=0; if(p==1){ scanf(\"%d\",&x); ask_point(1);//单点查询,输出第x个数 printf(\"%d\",ans); } else if(p==2){ scanf(\"%d%d\",&x,&y); change_point(1);//单点修改 } else if(p==3){ scanf(\"%d%d\",&a,&b);//区间查询 ask_interval(1); printf(\"%d\\n\",ans); } else{ scanf(\"%d%d%d\",&a,&b,&y);//区间修改 change_interval(1); } }}","categories":[{"name":"数据结构模板","slug":"数据结构模板","permalink":"https://anoyer.cn/categories/数据结构模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"后缀自动机模板","slug":"后缀自动机模板","date":"2018-10-03T08:56:15.000Z","updated":"2019-01-24T04:43:04.567Z","comments":true,"path":"article/后缀自动机模板.html","link":"","permalink":"https://anoyer.cn/article/后缀自动机模板.html","excerpt":"","text":"博主CSDNSAM常解决的问题:问题1.给定文本T,询问格式如下:给定字符串P,问P是否是T的子串。问题2.给定字符串S,问它有多少不同的子串。(模板中的GetSubNum函数)问题3.给定字符串S,求其所有不同子串的总长度。问题4.给定字符串S,一系列询问——给出整数K_i,计算S的所有子串排序后的第K_i个。问题5.给定字符串S,找到和它循环同构的字典序最小字符串。问题.给定文本T,询问格式如下:给定字符串P,希望找出P作为子串在文本T中出现了多少次(出现区间可以相交)。问题6.给定文本T,询问格式如下:给定字符串P,求P在文本中第一次出现的位置。问题7.给定文本T,询问格式如下:给定字符串P,要求给出P在T中的所有出现位置(出现区间可以相交)。问题8.给定两个字符串S和T。要求找出它们的最长公共子串,即一个字符串X,它同时是S和T的子串。模板1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374#include<stdio.h>#include<bits/stdc++.h>#define maxc 28using namespace std;const int maxn = 1e6 + 5;const int mod = 1e9 + 7;typedef long long ll;int len[maxn * 2], //最长子串的长度(该节点字串数量=len[x]-len[link[x]])link[maxn * 2], //后缀链接(最短串前部减少一个字符所到达的状态)cnt[maxn * 2], //被后缀连接的数nex[maxn * 2][maxc], //状态转移(尾部加一个字符的下一个状态)(图)idx, //节点编号last; //最后节点ll epos[maxn * 2]; // enpos数(该状态子串出现数量)char str[maxn];ll a[maxn]; //长度为i的子串出现最大次数void Iint() { //初始化 last = idx = 1; //1表示root起始点 空集 link[1] = len[1] = 0;}//SAM建图void Extend(int c) { //插入字符,为字符ascll码值 int x = ++idx; //创建一个新节点x; len[x] = len[last] + 1; // 长度等于最后一个节点+1 epos[x] = 1; //接受节点子串除后缀连接还需加一 int p; //第一个有C转移的节点; for (p = last; p && !nex[p][c]; p = link[p])nex[p][c] = x;//沿着后缀连接 将所有没有字符c转移的节点直接指向新节点 if (!p)link[x] = 1, cnt[1]++; //全部都没有c的转移 直接将新节点后缀连接到起点 else { int q = nex[p][c]; //p通过c转移到的节点 if (len[p] + 1 == len[q]) //pq是连续的 link[x] = q, cnt[q]++; //将新节点后缀连接指向q即可,q节点的被后缀连接数+1 else { int nq = ++idx; //不连续 需要复制一份q节点 len[nq] = len[p] + 1; //令nq与p连续 link[nq] = link[q]; //因后面link[q]改变此处不加cnt memcpy(nex[nq], nex[q], sizeof(nex[q])); //复制q的信息给nq for (; p&&nex[p][c] == q; p = link[p]) nex[p][c] = nq; //沿着后缀连接 将所有通过c转移为q的改为nq link[q] = link[x] = nq; //将x和q后缀连接改为nq cnt[nq] += 2; // nq增加两个后缀连接 } } last = x; //更新最后处理的节点}void GetNpos() { //求npos数,即该节点字串出现次数 queue<int>q; for (int i = 1; i <= idx; i++) if (!cnt[i])q.push(i); //将所有没被后缀连接指向的节点入队 while (!q.empty()) { int x = q.front(); q.pop(); epos[link[x]] += epos[x]; //子串数量等于所有后缀连接指向该节点的子串数量和+是否为接受节点 if (--cnt[link[x]] == 0)q.push(link[x]); //当所有后缀连接指向该节点的处理完毕后再入队 }}void GetSubNum() { //求不相同字串数量 ll ans = 0; for (int i = 2; i <= idx; i++)ans += len[i] - len[link[i]]; //一状态子串数量等于len[i]-len[link[i]] printf(\"%lld\\n\",ans);}void GetSubMax() { //求出所有长度为k的子串中出现次数最多的子串出现次数 GetNpos(); int n = strlen(str); for (int i = 1; i <= idx; i++)a[len[i]] = max(a[len[i]], epos[i]); //长度≤k的子串中出现次数最多的子串出现次数的最小值 for (int i = n - 1; i >= 1; i--)a[i] = max(a[i], a[i + 1]); //求一遍后缀最大值就是答案 for (int i = 1; i <= n; i++)printf(\"%lld\\n\", a[i]);}int main() { //freopen(\"c:/input.txt\",\"r\",stdin); return 0;}","categories":[{"name":"字符串模板","slug":"字符串模板","permalink":"https://anoyer.cn/categories/字符串模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"HDU-4300-Clairewd’s message(KMP+特判)","slug":"HDU-4300-Clairewd’s-message(KMP-特判)","date":"2018-09-30T06:45:51.000Z","updated":"2019-01-24T04:40:50.304Z","comments":true,"path":"article/HDU-4300-Clairewd’s-message(KMP-特判).html","link":"","permalink":"https://anoyer.cn/article/HDU-4300-Clairewd’s-message(KMP-特判).html","excerpt":"","text":"博主链接题目题意:先给你一个密码表。然后给你一个不一定完整的串。原串满足前一半是密码,后一半是明码。要求你最小的补全这个串。题解:设给的串长度为len,则1…(len+1)/2的字母一定是密码。我们将1…(len+1)/2的字母全部安装密码表转换成原文,然后将得到的串求Next数组。再根据Next数组求出最大的相等的前后缀(长度一定小于或等于len/2,题目要求),然后输出就可以。然后这里一定要先加一个特判是不是不存在相等的前后缀,也就是s[1]!=s[len],这时输出原串一次,再输出一次原串全解密的串.代码:1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465#include<stdio.h>#include<bits/stdc++.h>#define met(a) memset(a,0,sizeof(a))#define fup(i,a,n,b) for(int i=a;i<n;i+=b)#define fow(j,a,n,b) for(int j=a;j>0;j-=b)#define MOD(x) (x)%modusing namespace std;const int maxn = 1e6 + 10;const int mod = 1e9 + 7;typedef long long ll;char s[maxn],s1[maxn];char t[maxn];char m[33];int nex[maxn];void Get_nex() { int j = 0; for (int i = 1; s[i]; i++) { while (s[i] != s[j + 1] && j != 0)j = nex[j]; if (s[i] == s[j + 1] && i != 1)j++; nex[i] = j; }}int main() { int t,n; scanf(\"%d\", &t); while (t--) { scanf(\"%s\", m+1); scanf(\"%s\", s+1); int len = strlen(s+1); for (int i = 1;i<=len+1; i++)s1[i] = s[i]; for (int j = 1; j <= (len +1)/ 2; j++) { //进行原串前半部分解密 for (int i = 1; i <= 26; i++) { if (s[j] == m[i]) { s[j] = 'a' + i-1; break; } } } Get_nex(); int nn =0; int a = nex[len]; if (a == 0) { // 如果不存在相等的前后缀 printf(\"%s\", s1 + 1); for (int j = (len+1)/2+1; j <= len; j++) { for (int i = 1; i <= 26; i++) { if (s[j] == m[i]) { s[j] = 'a' + i - 1; break; } } } printf(\"%s\\n\", s+1); continue; } while (a != 0) { //找出最大的相等的前后缀且长度小于或等于len/2 if (s[a] == s[len]) { if (a <= len / 2)nn = max(nn, a); a = nex[a]; } } printf(\"%s\", s1+1); for (int i = nn+1; i <= len -nn; ++i)printf(\"%c\",s[i]); printf(\"\\n\"); }}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"HDU","slug":"HDU","permalink":"https://anoyer.cn/tags/HDU/"},{"name":"KMP","slug":"KMP","permalink":"https://anoyer.cn/tags/KMP/"},{"name":"字符串题解","slug":"字符串题解","permalink":"https://anoyer.cn/tags/字符串题解/"}]},{"title":"HDU-2594-Simpsons’ Hidden Talents(KMP的next数组应用)","slug":"HDU-2594-Simpsons’-Hidden-Talents(KMP的next数组应用)","date":"2018-09-28T14:57:50.000Z","updated":"2019-01-24T04:40:22.900Z","comments":true,"path":"article/HDU-2594-Simpsons’-Hidden-Talents(KMP的next数组应用).html","link":"","permalink":"https://anoyer.cn/article/HDU-2594-Simpsons’-Hidden-Talents(KMP的next数组应用).html","excerpt":"","text":"博主链接题目题意:给你两个串,求第一个串的前缀和第二个串的后缀的相同长度题解:( 这题和POJ2752基本一样,都是利用next性质求公共前后缀 )。利用strcat(s,s1)将两个串接起来,利用KMP的next数组性质如果s[next[n-1]]=s[n],则此时前后缀相同,然后再开始回滚,若s[next[n-1]] == s[n-1],则子串s[0,1,2,…,next[n-1]]是满足条件的子串。然后判断s[next[next[n-1]]] == s[n-1]是否成立,这样一直回滚,直到next[next[…..next[n-1]]] == -1为止,这样求出最长的长度ans,判断ans是否大于两个串的较短串的长度,如果大于ans=min(len1,len2);(因为如果ans大于min,则一定存在长度为min的公共前后缀)代码:12345678910111213141516171819202122232425262728293031323334353637#include<stdio.h>#include<bits/stdc++.h>using namespace std;const int maxn = 1e5 + 7;char s[maxn],s1[maxn];int nex[maxn],len;void Get_Nex() { int j = -1; for (int i = 0; s[i]; i++) { while (s[i] != s[j + 1] && j != -1)j = nex[j]; if (s[i] == s[j + 1] && i != 0)j++; nex[i] = j; }}int main() { while (scanf(\"%s\", s) != EOF) { scanf(\"%s\", s1); int len1 = strlen(s1); int len2 = strlen(s); strcat(s, s1); len = len1 + len2; Get_Nex(); int a = nex[len - 1], ans = 0, mi = min(len1, len2); while (a != -1) { if (s[a] == s[len - 1]) { if (ans < a + 1)ans = a + 1; a = nex[a]; } } if (ans > mi)ans = mi; for (int i = 0; i < ans; i++) { putchar(s[i]); if (i == ans - 1)printf(\" \"); } printf(\"%d\\n\", ans); }}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"HDU","slug":"HDU","permalink":"https://anoyer.cn/tags/HDU/"},{"name":"KMP","slug":"KMP","permalink":"https://anoyer.cn/tags/KMP/"},{"name":"字符串题解","slug":"字符串题解","permalink":"https://anoyer.cn/tags/字符串题解/"}]},{"title":"POJ2752-Seek-the-Name-Seek-the-Fame(找相同的前后缀)","slug":"POJ-2752-Seek-the-Name-Seek-the-Fame(找相同的前后缀)","date":"2018-09-28T11:00:01.000Z","updated":"2019-01-24T04:42:06.728Z","comments":true,"path":"article/POJ-2752-Seek-the-Name-Seek-the-Fame(找相同的前后缀).html","link":"","permalink":"https://anoyer.cn/article/POJ-2752-Seek-the-Name-Seek-the-Fame(找相同的前后缀).html","excerpt":"","text":"题目博主博客题意:求一个串中相同前后缀长度,并输出思路:利用KMP的next数组性质;如果s[next[n-1]]=s[n],则此时前后缀相同,然后再开始回滚,==若s[next[n-1]] == s[n-1],则子串s[0,1,2,…,next[n-1]]是满足条件的子串==。然后判断s[next[next[n-1]]] == s[n-1]是否成立,这样一直回滚,直到next[next[…..next[n-1]]] == -1为止代码:1234567891011121314151617181920212223242526272829303132333435363738394041424344#include<stdio.h>#include<cstring>#include<stack>#define met(a) memset(a,0,sizeof(a))#define fup(i,a,n,b) for(int i=a;i<n;i+=b)#define fow(j,a,n,b) for(int j=a;j>0;j-=b)#define MOD(x) (x)%modusing namespace std;const int maxn = 4e5 + 10;const int mod = 1e9 + 7;typedef long long ll;char s[maxn];int nex[maxn];int len;void Get_Nex() { int j = -1; for (int i = 0; i < len; i++) { while (s[i] != s[j + 1] && j != -1)j = nex[j]; if (s[i] == s[j + 1] && i != 0)j++; nex[i] = j; }}stack<int>M;int main() { while (scanf(\"%s\", s) != EOF) { len = strlen(s); Get_Nex(); int a = nex[len - 1]; M.push(len); while (a != -1) { if (s[a] == s[len - 1]) { M.push(a + 1); a = nex[a]; } } while (!M.empty()) { printf(\"%d \", M.top()); M.pop(); } puts(\"\"); //for (int i = 0; i < len; i++)printf(\"%d \", nex[i]); } return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"KMP","slug":"KMP","permalink":"https://anoyer.cn/tags/KMP/"},{"name":"字符串题解","slug":"字符串题解","permalink":"https://anoyer.cn/tags/字符串题解/"},{"name":"POJ","slug":"POJ","permalink":"https://anoyer.cn/tags/POJ/"}]},{"title":"POJ-3080 Blue Jeans(kmp+暴力求子串)","slug":"POJ-3080-Blue-Jeans-kmp-暴力求子串","date":"2018-09-26T14:09:17.000Z","updated":"2019-01-24T04:42:10.842Z","comments":true,"path":"article/POJ-3080-Blue-Jeans-kmp-暴力求子串.html","link":"","permalink":"https://anoyer.cn/article/POJ-3080-Blue-Jeans-kmp-暴力求子串.html","excerpt":"","text":"题目题意:给一个n,输入n个长度为60的字符串,求==最长公共子串==(2<n<=10),如果公共串长度大于等于3就输出这个子串(~~开始真的是瞎了,看了题直接将所有字符串连接来,求了波next数组,然后完美求出了子串长度,却发现要求是输出子串,心里***~~)**思路:(==KMP+暴力求子串==)枚举第一个字符串的不同长度子串,判断她是否为下面多有的公共子串?如果是的话,那么我们就表明找到,则比较其长度,如果比已经找到的串长,那么就替换结果串 否则按字典序比较。取字典序考前的,就可以。代码:1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465#include<cstdio>#include<bits/stdc++.h>using namespace std;char str[10][62];char substr[62];char result[62];char temp[62];int next[62];int len, n, max;void get_next() { next[0] = -1; int j = -1; for (int i = 1; i < len; i++) { while (j > -1 && substr[j + 1] != substr[i]) j = next[j]; if (substr[j + 1] == substr[i]) j++; next[i] = j; }}void kmp() { int j, m; get_next(); for (int k = 1; k < n; k++) { j = -1, m = -1;//m最好取-1 for (int i = 0; i < 60; i++) { while (j > -1 && substr[j + 1] != str[k][i]) j = next[j]; if (substr[j + 1] == str[k][i]) j++; if (j > m) m = j; //m取可匹配到的最大值 } if (m < max) max = m;//max取可匹配到的最小值,公共子串以最小者为准 }}int main() { int t, i, ans; scanf(\"%d\", &t); while (t--) { scanf(\"%d\", &n); for (i = 0; i < n; i++) scanf(\"%s\", str[i]); ans = 0; for (i = 0; i < 58; i++) { strcpy(substr, str[0] + i);//枚举第一个串的所有后缀串 len = 60 - i; max = 65; kmp(); if (max > ans) { ans = max; strncpy(result, str[0] + i, ans + 1); result[ans + 1] = '\\0'; } else if (max == ans) { //若有相等长度,取字典序小者 strncpy(temp, str[0] + i, ans + 1); temp[ans + 1] = '\\0'; if (strcmp(result, temp) > 0) strcpy(result, temp); } } if (ans >= 2) printf(\"%s\\n\", result); else printf(\"no significant commonalities\\n\"); } return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"暴力题","slug":"暴力题","permalink":"https://anoyer.cn/tags/暴力题/"},{"name":"KMP","slug":"KMP","permalink":"https://anoyer.cn/tags/KMP/"},{"name":"字符串题解","slug":"字符串题解","permalink":"https://anoyer.cn/tags/字符串题解/"},{"name":"POJ","slug":"POJ","permalink":"https://anoyer.cn/tags/POJ/"}]},{"title":"C/C++文件读写大杂烩","slug":"C++文件读写","date":"2018-09-25T14:46:08.000Z","updated":"2019-01-24T04:47:21.102Z","comments":true,"path":"article/C++文件读写.html","link":"","permalink":"https://anoyer.cn/article/C++文件读写.html","excerpt":"","text":"c++:ifstream12345fstream in; //读文件in.open(\"路径\"); //只读 可以放在fstreaam in(\"路径\");fstream out; //写文件out.open(\"路径\");out.close();//关闭文件如果文件不存在返回错误1234if (!in.is_open()) { //文件不存在,返回错误,并生成一个文件 cout << \"Error!\" << endl; exit(1); //终止程序}如果文件不存在新建12fstream in;in.open(\"路径\",fstream::out||fstream::in);成功打开文件后写入数组,写入文件12in>>a[i];out<<a[i];C:stdio.h ,stdlib.h123456789FILE *fp; //文件指针变量fp=fopen(\"路径\",“文件使用方式”); //文件使用方式:r,w,a,rb,wb,ab,r+,w+,a+,rb+,wb+,ab+fclose(fp); //关闭文件fgetc(fp); //从fp指向文件读入一个字符fputs(ch,fp); //把字符写入fp指向文件fgets(str,n,fp); //从fp指向文件中读入一个长度为n-1的字符串存在str中fputs(str,fp) //把str写入fp指向文件fprintf(fp,\"%d%s\",i,str); //向fp中输入整数i,字符串str;fscanf(fp,\"%d%s\",i,str); //从fp文件中读出一个整数一个字符串给整数i,字符串str二进制读写–常用于读写结构体12fread(变量地址,size,count,fp); //从fp指的文件中读入连续count个size字节数据写入到变量fwrite(变量地址,size,count,fp); //从变量中取出连续count个size字节数据写入到fp指向文件中","categories":[{"name":"C++语法","slug":"C-语法","permalink":"https://anoyer.cn/categories/C-语法/"}],"tags":[{"name":"语法","slug":"语法","permalink":"https://anoyer.cn/tags/语法/"}]},{"title":"Codeforces Round 512--C.Vasya and Golden Ti","slug":"Codeforces-Round-512-Div-2-based-on-Technocup-2019-Elimination-Round-1-C-Vasya-and-Golden-Ti","date":"2018-09-23T16:00:44.000Z","updated":"2019-01-24T04:38:30.191Z","comments":true,"path":"article/Codeforces-Round-512-Div-2-based-on-Technocup-2019-Elimination-Round-1-C-Vasya-and-Golden-Ti.html","link":"","permalink":"https://anoyer.cn/article/Codeforces-Round-512-Div-2-based-on-Technocup-2019-Elimination-Round-1-C-Vasya-and-Golden-Ti.html","excerpt":"","text":"题目题意:给你一个由0-9组成的串,问能不能将串分成2份及两份以上,使每份数和相等解题思路:先特判下如果串中只有一种字符且串长度大于2则肯定可以,然后求出把0消去后串的前缀和(因为0对和没影响。再枚举i(i从1到n)位的前缀和num[i],再看看(i-n)中有多少个前缀和num[j]能整除num[i],如果满足的数量ans大于等于2且num[n]/ans==num[i],则一定可以分成ans份,否则输出no代码:123456789101112131415161718192021222324252627282930313233343536#include<stdio.h>#include<bits/stdc++.h>using namespace std;const int maxn = 1e6 + 5;char s[110];int num[110];int main() { int n; scanf(\"%d\", &n); scanf(\"%s\", s+1); int cnt = 1; for(int i=1;i<=n;i++){ if (s[i] == '0')continue; num[cnt] = num[cnt - 1] + s[i] - '0'; cnt++; } int flag = 1; for (int i = 1; i <n; i++) { if (s[i] != s[i + 1])flag = 0; } if (flag&&n >= 2) { printf(\"YES\\n\"); return 0; } for (int i = 1; i < cnt; i++) { int ans = 0; for (int j = i; j < cnt; j++) { if (num[j] % num[i] == 0)ans++; } if (ans >= 2 && num[cnt - 1] % num[i] == 0 && num[cnt - 1] == num[i]*ans) { printf(\"YES\\n\"); return 0; } } printf(\"NO\\n\");}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"codeforces","slug":"codeforces","permalink":"https://anoyer.cn/tags/codeforces/"},{"name":"思维题","slug":"思维题","permalink":"https://anoyer.cn/tags/思维题/"}]},{"title":"Codeforces Round 512--B.Vasya and Cornfield","slug":"Codeforces-Round-512-Div-2-based-on-Technocup-2019-Elimination-Round-1-B-Vasya-and-Cornfield","date":"2018-09-23T15:51:08.000Z","updated":"2019-01-24T04:38:30.896Z","comments":true,"path":"article/Codeforces-Round-512-Div-2-based-on-Technocup-2019-Elimination-Round-1-B-Vasya-and-Cornfield.html","link":"","permalink":"https://anoyer.cn/article/Codeforces-Round-512-Div-2-based-on-Technocup-2019-Elimination-Round-1-B-Vasya-and-Cornfield.html","excerpt":"","text":"题目题意:给出一个矩形,顶点坐标具有笛卡尔性质,然后m次询问,每次询问给一个点,温这个点是否再矩形内解题思路:因为矩形顶点具有笛卡尔性质所以矩形4条边的方程分别为y=a+x,y=a-x,y=x-a,y=2*n-d-x,所以判断下点和4条边的关系便可值答案代码:12345678910111213141516171819202122#include<stdio.h>#include<bits/stdc++.h>#define met(a) memset(a,0,sizeof(a))#define fup(i,a,n,b) for(int i=a;i<n;i+=b)#define fow(j,a,n,b) for(int j=a;j>0;j-=b)#define MOD(x) (x)%modusing namespace std;const int maxn = 1e5 + 5;const int mod = 1e9 + 7;typedef long long ll;int main() { int n, d; scanf(\"%d%d\", &n, &d); int m; scanf(\"%d\", &m); int x, y; for (int i = 0; i < m; i++) { scanf(\"%d%d\", &x, &y); if (x + d>=y&&x - d<=y&&d - x <=y && 2 * n - d - x >= y)printf(\"YES\\n\"); else printf(\"NO\\n\"); }}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"codeforces","slug":"codeforces","permalink":"https://anoyer.cn/tags/codeforces/"},{"name":"思维题","slug":"思维题","permalink":"https://anoyer.cn/tags/思维题/"}]},{"title":"HDU-1358-Period(KMP求前缀循环节)","slug":"HDU-1358-Period(KMP求前缀循环节)","date":"2018-09-23T07:50:11.000Z","updated":"2019-01-24T04:39:56.815Z","comments":true,"path":"article/HDU-1358-Period(KMP求前缀循环节).html","link":"","permalink":"https://anoyer.cn/article/HDU-1358-Period(KMP求前缀循环节).html","excerpt":"","text":"题目题意:给定一个字符串,求出所有循环的前缀串,输出前缀串的长度和循环的次数(大于一才算循环串)解题思路:思路是先构造出 next[] 数组,下标为 i,定义一个变量 j = i - next[i] 就是next数组下标和下标对应值的差,如果这个差能整除下标 i,即 i%j==0 ,则说明下标i之前的字符串(周期性字符串长度为 i)一定可以由一个前缀周期性的表示出来,这个前缀的长度为刚才求得的那个差,即 j,则这个前缀出现的次数为 i/j 。所以最后输出i和i/j即可。代码:123456789101112131415161718192021222324252627282930313233343536373839#include<stdio.h>#include<bits/stdc++.h>#define met(a) memset(a,0,sizeof(a))#define fup(i,a,n,b) for(int i=a;i<n;i+=b)#define fow(j,a,n,b) for(int j=a;j>0;j-=b)#define MOD(x) (x)%modusing namespace std;const int maxn = 1e6 + 5;char s[maxn];int nex[maxn];int n;void get_nex() { int j = -1; for (int i = 0; s[i]; i++) { while (s[i] != s[j + 1] && j != -1)j = nex[j]; if (s[i] == s[j + 1]&&i!=0)j++; nex[i] = j; }}void Solve() { for (int i = 1; i < n; i++) { int L = i - nex[i]; if ((i + 1) % L == 0 && (i+1) / L > 1) { printf(\"%d %d\\n\", i+1, (i+1) / L); } }}int main() { int Case = 0; while (scanf(\"%d\", &n)) { if (n == 0)break; scanf(\"%s\", s); get_nex(); printf(\"Test case #%d\\n\",++Case); Solve(); printf(\"\\n\"); //for(int i=0;i<n;i++)printf(\"%d \",nex[i]); }}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"HDU","slug":"HDU","permalink":"https://anoyer.cn/tags/HDU/"},{"name":"KMP","slug":"KMP","permalink":"https://anoyer.cn/tags/KMP/"},{"name":"字符串题解","slug":"字符串题解","permalink":"https://anoyer.cn/tags/字符串题解/"}]},{"title":"Codeforces-Round-511-Div-2-C-Enlarge-GCD","slug":"Codeforces-Round-511-Div-2-C-Enlarge-GCD","date":"2018-09-21T16:56:54.000Z","updated":"2019-01-24T04:38:31.481Z","comments":true,"path":"article/Codeforces-Round-511-Div-2-C-Enlarge-GCD.html","link":"","permalink":"https://anoyer.cn/article/Codeforces-Round-511-Div-2-C-Enlarge-GCD.html","excerpt":"","text":"题目链接解题思路题解:先求出元素的最大公因子,开一个数组num记录每个数出现次数,再利用素数筛,求出所有数有当前质数因子的的个数代码12345678910111213141516171819202122232425262728293031323334353637383940#include<stdio.h>#include<bits/stdc++.h>#define met(a) memset(a,0,sizeof(a))#define fup(i,a,n,b) for(int i=a;i<n;i+=b)#define fow(j,a,n,b) for(int j=a;j>0;j-=b)#define MOD(x) (x)%modusing namespace std;const int maxn = 1.5e7 + 10;const int mod = 1e9 + 7;typedef long long ll;int P[maxn], num[maxn], a[300005], p[300005];int gcd(int a, int b){ if (!b) return a; return gcd(b, a % b);}int main() { int n,d=0; scanf(\"%d\", &n); for (int i = 0; i < n; i++) { scanf(\"%d\", &a[i]); num[a[i]]++; if (!d) d = a[i]; else d = gcd(d, a[i]); } int ans = n; for (int i = d + 1; i < maxn; i++) if (!P[i]) { int cnt = 0, j; for (j = i; j < maxn; j += i) P[j] = 1, cnt += num[j]; ans = min(ans, n - cnt); } if (ans < n)printf(\"%d\\n\", ans); else printf(\"-1\\n\"); return 0;}","categories":[{"name":"题解","slug":"题解","permalink":"https://anoyer.cn/categories/题解/"}],"tags":[{"name":"codeforces","slug":"codeforces","permalink":"https://anoyer.cn/tags/codeforces/"},{"name":"思维题","slug":"思维题","permalink":"https://anoyer.cn/tags/思维题/"}]},{"title":"后缀数组DA模板","slug":"后缀数组模板","date":"2018-09-18T13:46:12.000Z","updated":"2019-01-24T04:43:00.699Z","comments":true,"path":"article/后缀数组模板.html","link":"","permalink":"https://anoyer.cn/article/后缀数组模板.html","excerpt":"","text":"suffix array倍增算法 O(n*logn)待排序数组⻓长度为n,放在0~n-1中,在后⾯面补⼀一个0da(str, sa, rank, height, n, m);例如:n = 8;num[] = { 1, 1, 2, 1, 1, 1, 1, 2, $ }; 注意num后⼀一位为0,其他⼤大于0rank[] = { 4, 6, 8, 1, 2, 3, 5, 7, 0 }; rank[0~n-1]为有效值,rank[n]必定为0无效值sa[] = { 8, 3, 4, 5, 0, 6, 1, 7, 2 }; sa[1~n]为有效值,sa[0]必定为n是⽆无效值height[]= { 0, 0, 3, 2, 3, 1, 2, 0, 1 }; height[2~n]为有效值稍微改动可以求⻓长公共前缀,需要注意两串串起始位置相同的情况另外需要注意的是部分数组需要开两倍空间⼤大⼩小12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273/* Problem: JZOJ1598(询问一个字符串中有多少至少出现两次的子串) Content: SA's Code and Explanation Author : Anoyer*/#include <cstdio>#include <cstring>#include <algorithm>#include<iostream>using namespace std;const int MAXN = 100005;char ch[MAXN], All[MAXN];int SA[MAXN], rank[MAXN], Height[MAXN], tax[MAXN], tp[MAXN], a[MAXN], n, m; char str[MAXN];//rank[i] 第i个后缀的排名; SA[i] 排名为i的后缀位置; Height[i] 排名为i的后缀与排名为(i-1)的后缀的LCP//tax[i] 计数排序辅助数组; tp[i] rank的辅助数组(计数排序中的第二关键字),与SA意义一样。//a为原串void RSort() { //rank第一关键字,tp第二关键字。 for (int i = 0; i <= m; i ++) tax[i] = 0; for (int i = 1; i <= n; i ++) tax[rank[tp[i]]] ++; for (int i = 1; i <= m; i ++) tax[i] += tax[i-1]; for (int i = n; i >= 1; i --) SA[tax[rank[tp[i]]] --] = tp[i]; //确保满足第一关键字的同时,再满足第二关键字的要求} //计数排序,把新的二元组排序。int cmp(int *f, int x, int y, int w) { return f[x] == f[y] && f[x + w] == f[y + w]; } //通过二元组两个下标的比较,确定两个子串是否相同void Suffix() { //SA for (int i = 1; i <= n; i ++) rank[i] = a[i], tp[i] = i; m = 127 ,RSort(); //一开始是以单个字符为单位,所以(m = 127) for (int w = 1, p = 1, i; p < n; w += w, m = p) { //把子串长度翻倍,更新rank //w 当前一个子串的长度; m 当前离散后的排名种类数 //当前的tp(第二关键字)可直接由上一次的SA的得到 for (p = 0, i = n - w + 1; i <= n; i ++) tp[++ p] = i; //长度越界,第二关键字为0 for (i = 1; i <= n; i ++) if (SA[i] > w) tp[++ p] = SA[i] - w; //更新SA值,并用tp暂时存下上一轮的rank(用于cmp比较) RSort(), swap(rank, tp), rank[SA[1]] = p = 1; //用已经完成的SA来更新与它互逆的rank,并离散rank for (i = 2; i <= n; i ++) rank[SA[i]] = cmp(tp, SA[i], SA[i - 1], w) ? p : ++ p; } //离散:把相等的字符串的rank设为相同。 //LCP int j, k = 0; for(int i = 1; i <= n; Height[rank[i ++]] = k) for( k = k ? k - 1 : k, j = SA[rank[i] - 1]; a[i + k] == a[j + k]; ++ k); //这个知道原理后就比较好理解程序}void Init() { scanf(\"%s\", str+1); n = strlen(str+1); for (int i = 1; i <=n; i ++) a[i ] = str[i];}int main() { Init(); Suffix(); for(int i=1;i<=n;i++)cout<<SA[i]<<endl; for(int i=1;i<=n;i++){ printf(\"%s\\n\",str+SA[i]); } /*int ans = Height[2]; for (int i = 3; i <= n; i ++) ans += max(Height[i] - Height[i - 1], 0); printf(\"%d\\n\", ans); */}","categories":[{"name":"字符串模板","slug":"字符串模板","permalink":"https://anoyer.cn/categories/字符串模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"AC自动机模板","slug":"AC自动机模板","date":"2018-09-17T16:06:04.000Z","updated":"2019-01-24T04:39:04.752Z","comments":true,"path":"article/AC自动机模板.html","link":"","permalink":"https://anoyer.cn/article/AC自动机模板.html","excerpt":"","text":"经常用来解决多模式匹配问题:就是有多个模式串P1,P2,P3…,Pm,求出所有这些模式串在连续文本T1….n中的所有可能出现的位置。例如:求出模式集合{“nihao”,”hao”,”hs”,”hsr”}在给定文本”sdmfhsgnshejfgnihaofhsrnihao”中所有可能出现的位置给出L个模式字符串(加总长度为N),以及长度为M大文本,要求从大文本中提取每个模式字符串出现的位置。如果使用KMP算法,时间复杂度将达到O(LM+N),而使用AC自动机可以在O(N+M)时间复杂度内解决这一问题,当L很大时,AC自动机的优势非常明显。1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586#include<stdio.h>#include<bits/stdc++.h>#define ll long long int#define max_n 1000050#define max_tot 500050#define met(a) memset(a,0,sizeof(a))#define fup(i,a,n,b) for(int i=a;i<n;i+=b)#define fow(j,a,n,b) for(int j=a;j>0;j-=b)#define MOD(x) (x)%modusing namespace std;const int maxn = 1e5 + 7;struct Ac { struct state { //节点状态 int next[26]; int fail, cnt;//指针fail 到这个节点有cnt个串结束 }stable[max_tot]; int size; //当前AC自动机节点个数 queue<int>q; void init() { //初始化 met(stable); size = 1; while (!q.empty())q.pop(); } void insert(char *s) { //将模式串插入trie树 int now = 0; //代表走到那个节点 for (int i = 0; s[i]; i++) { char ch = s[i]-'a'; if (!stable[now].next[ch]) //节点不存在该字母边,则新建一个 stable[now].next[ch] = size++; now = stable[now].next[ch]; } stable[now].cnt++;//结束位置++; } void build() { //构造失配fail指针,要构造当前节点fail指针需先构造爸爸节点 for (int i = 0; i < 26; i++)if (stable[0].next[i])q.push(stable[0].next[i]); while (!q.empty()) { int u = q.front(); q.pop(); for (int i = 0; i < 26; i++) { if (stable[u].next[i]) { //如果有i这条边 枚举下他儿子 int v = stable[u].fail; int a = stable[u].next[i]; while (v) { //一直按箭头的fail if (stable[v].next[i]) { //如果他某个祖先有i这条边 stable[a].fail = stable[v].next[i]; break; } v = stable[v].fail; } if (!stable[a].fail)stable[a].fail = stable[0].next[i]; q.push(stable[u].next[i]); //节点加进去 } } } } int get(int u) { //算所有祖先的和 int res = 0; while (u) { res = res + stable[u].cnt; stable[u].cnt = 0; //计算后不再计算,如果要计算不清零 u = stable[u].fail; } return res; } int match(char *s) { //匹配 int res = 0, now = 0; for (int i = 0; s[i]; i++) { char ch = s[i]-'a'; if (stable[now].next[ch]) //如果当前状态太能找到后继节点,则走他 now = stable[now].next[ch]; else { //否则只能跳爸爸 int p = stable[now].fail; while (p && stable[p].next[ch] == 0)p = stable[p].fail; //始终没找到,只能指根节点 //找到就跳对应地方 now = stable[p].next[ch]; } if (stable[now].cnt)res = res + get(now);// } return res; }}Ac;char s[max_n];int main(int argc, char *argv[]) {#ifdef LOCAL freopen(\"C:/input.txt\", \"r\", stdin);#endif}应用:查找母串中各单词出现次数–对应题目P3796123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123#include<stdio.h>#include<bits/stdc++.h>#define ll long long int#define max_n 1000050#define max_tot 500050#define met(a) memset(a,0,sizeof(a))#define fup(i,a,n,b) for(int i=a;i<n;i+=b)#define fow(j,a,n,b) for(int j=a;j>0;j-=b)#define MOD(x) (x)%modusing namespace std;const int maxn = 1e5 + 7;struct aa { int i; int cnt;}ans[180];int cmp(aa a, aa b) { if (a.cnt == b.cnt)return a.i < b.i; else return a.cnt > b.cnt;}struct Ac { struct state { //节点状态 int next[26]; int fail, cnt;//指针fail 到这个节点有cnt个串结束 }stable[max_tot]; int size; //当前AC自动机节点个数 queue<int>q; void init() { //初始化 met(stable); size = 1; while (!q.empty())q.pop(); for (int i = 0; i <= 150; i++) { ans[i].i = i; ans[i].cnt = 0; } } void insert(char *s,int n) { //将模式串插入trie树 int now = 0; //代表走到那个节点 for (int i = 0; s[i]; i++) { char ch = s[i]-'a'; if (!stable[now].next[ch]) //节点不存在该字母边,则新建一个 stable[now].next[ch] = size++; now = stable[now].next[ch]; } stable[now].cnt=n;//结束位置++; } void build() { //构造失配fail指针,要构造当前节点fail指针需先构造爸爸节点 for (int i = 0; i < 26; i++)if (stable[0].next[i])q.push(stable[0].next[i]); while (!q.empty()) { int u = q.front(); q.pop(); for (int i = 0; i < 26; i++) { if (stable[u].next[i]) { //如果有i这条边 枚举下他儿子 int v = stable[u].fail; int a = stable[u].next[i]; while (v) { //一直按箭头的fail if (stable[v].next[i]) { //如果他某个祖先有i这条边 stable[a].fail = stable[v].next[i]; break; } v = stable[v].fail; } if (!stable[a].fail)stable[a].fail = stable[0].next[i]; q.push(stable[u].next[i]); //节点加进去 } } } } void get(int u) { //算所有祖先的和 int res = 0; u = stable[u].fail; while (u) { if(stable[u].cnt)ans[stable[u].cnt].cnt++; //找个数 u = stable[u].fail; } return; } int match(char *s) { //匹配 int res = 0, now = 0; for (int i = 0; s[i]; i++) { char ch = s[i]-'a'; if (stable[now].next[ch]) //如果当前状态太能找到后继节点,则走他 now = stable[now].next[ch]; else { //否则只能跳爸爸 int p = stable[now].fail; while (p && stable[p].next[ch] == 0)p = stable[p].fail; //始终没找到,只能指根节点 //找到就跳对应地方 now = stable[p].next[ch]; } if (stable[now].cnt) { ans[stable[now].cnt].cnt++; } get(now); } return res; }}Ac;char s[max_n];char s1[200][80];int main(int argc, char *argv[]) { /*ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);*/ int t, n; while (scanf(\"%d\", &n)&&n!=0) { Ac.init(); for (int i = 1; i <= n; i++) { scanf(\"%s\", s1[i]); Ac.insert(s1[i], i); } Ac.build(); scanf(\"%s\", s); Ac.match(s); sort(ans, ans + n+1, cmp); printf(\"%d\\n\", ans[0].cnt); printf(\"%s\\n\", s1[ans[0].i]); for (int i = 1; i < n; i++) { if (ans[i].cnt == ans[0].cnt)printf(\"%s\\n\", s1[ans[i].i]); else break; } } return 0;}","categories":[{"name":"字符串模板","slug":"字符串模板","permalink":"https://anoyer.cn/categories/字符串模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"字符串Hash模板","slug":"字符串Hash模板","date":"2018-09-17T15:56:56.000Z","updated":"2019-01-24T04:43:17.601Z","comments":true,"path":"article/字符串Hash模板.html","link":"","permalink":"https://anoyer.cn/article/字符串Hash模板.html","excerpt":"","text":"字符串 Hash注意:m选择足够大的质数(至少大于字符串个数)12345678910111213141516171819#include<stdio.h>#include<bits/stdc++.h>#define ll long long intusing namespace std;ll gethash(char *s,int m){ ll h=0; for(int i=0;s[i];i++) h=((h<<8)+s[i])%m; return h;}int main(){ #ifdef LOCAL //freopen(\"C:/Users/Administrator/Desktop/input.txt\",\"r\",stdin); #endif char a[100]=\"22222222222222222222222222222\"; char b[100]=\"22222222222222222222222223222\"; printf(\"%lld\\n\",gethash(a,1e9+7)); printf(\"%lld\\n\",gethash(b,1e9+7));}","categories":[{"name":"字符串模板","slug":"字符串模板","permalink":"https://anoyer.cn/categories/字符串模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"Karp-Rabin算法模板","slug":"Karp-Rabin算法模板","date":"2018-09-17T15:53:25.000Z","updated":"2019-01-24T04:41:28.253Z","comments":true,"path":"article/Karp-Rabin算法模板.html","link":"","permalink":"https://anoyer.cn/article/Karp-Rabin算法模板.html","excerpt":"","text":"Karp Rabin 算法是利用hash函数的特性进行字符串匹配的。KR算法对模式串和循环中每一次要匹配的子串按一定的hash函数求值,如果hash值相同,才进一步比较这两个串是否真正相等12345678910111213141516171819202122232425262728293031323334353637383940#include<stdio.h>#include<iostream>#include<algorithm>#include<string>#include<cstring>#define d 256 //字符表中字符数目 using namespace std;string s,p;void RK(int q){ //assert( s&& p && q > 0 ); //如果传递的有错,则打印提示 int m=p.size(); int n=s.size(); int p_h=0; //模式串hash int s_h=0; //s串hash int h=1; for(int i=0;i<m-1;i++)h=(h*d)%q; //h表示ts+1 = 10(31415 - 10000*3) +2 = 14152中的10000 for(int i=0;i<m;i++){ p_h= ( d * p_h + p[i] ) % q; s_h= ( d * s_h + s[i] ) % q; } //求出开始p_h 和 s_h for(int i=0;i<n-m;i++){ if(p_h==s_h){ int j; for(j=0;j<m;j++) if(s[i+j]!=p[j])break; if(j==m)printf(\"P occurs with shifts: %d\\n\",i); } if(i<n-m){ s_h=(d*(s_h-s[i]*h)+s[i+m])%q; if(s_h<0) s_h+=q; } }}int main(){ s=\"GEEKlmnaS FOR GEEKlmnaS njknaskjdaskjbdkjasbdjas njabijbaslbckjsbfGEEKlmnaS FOR GEEKlmnaS\"; p=\"GEEKlmna\"; int mod=127; ////需要比s长度大 RK(mod);}","categories":[{"name":"字符串模板","slug":"字符串模板","permalink":"https://anoyer.cn/categories/字符串模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"KMP模板及优化","slug":"KMP模板及优化","date":"2018-09-17T15:49:38.000Z","updated":"2019-01-24T04:41:37.073Z","comments":true,"path":"article/KMP模板及优化.html","link":"","permalink":"https://anoyer.cn/article/KMP模板及优化.html","excerpt":"","text":"解决问题:字符串匹配。给你两个字符串,寻找其中一个字符串是否包含另一个字符串,如果包含,返回包含的起始位置。 或者给你两个字符串,查找一个字符串在另外一个字符串中出现了几次1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465#include<bits/stdc++.h>using namespace std;const int maxn=10001;int next[maxn];char s[maxn];char p[maxn];int cnt=0;void prefix_next(int n){ next[0]=0; int len=0; int i=1; while(i<n){ if(p[i]==p[len]){ len++; next[i]=len; } else { if(len>0){ len=next[len-1]; } else{ next[i++]=len; } } } return;}void move_next(int n){ for(int i=n-1;i>0;i--){ next[i]=next[i-1]; } next[0]=-1; return;}void kmp_search(){ int n=strlen(p); int m=strlen(s); prefix_next(n); move_next(n); int i=0; int j=0; while(i<m){ if(s[i]==p[j]&&j==n-1){ printf(\"No.%d-->%d\\n\",++cnt,i-j); j=next[j]; } if(s[i]==p[j]){ i++; j++; } else{ j=next[j]; if(j==-1){ i++;j++; } } } if(cnt==0)cout<<\"NO FOUD\"<<endl; return;}int main(){ cin>>s; cin>>p; kmp_search();}KMP优化模板12345678910111213141516171819202122232425262728293031323334353637383940414243#include<iostream>#include<stdio.h>#include<string.h>using namespace std;char s[1000005],t[200000];int slen,tlen;int nex[200000];//nex数组大小和短串一致int ans,a,b,c,d,n,m;inline void get_nex(){ int j=-1;//j初始化为-1 for (int i=0;i<tlen;i++){ while (t[i]!=t[j+1] && j!=-1)//如果下一个不同,那么j就变成next[j],注意next[j]是小于j的,无论j取任何值 j=nex[j];//往前回溯 if (t[i]==t[j+1] && i!=0) j++;//如果相同,j++ nex[i]=j;//这个是把算的j的值(就是相同的最大前缀和最大后缀长)赋给next[i] }}inline void kmp(){ int j=-1; for (int i=0;i<slen;i++){ while (s[i]!=t[j+1] && j!=-1) j=nex[j]; if (s[i]==t[j+1]) j++; if (j==tlen-1) ans++,j=nex[j]; }}int main(){ scanf(\"%d\",&n); for (int i=1;i<=n;i++){ ans=0; scanf(\"%s %s\",t,s); slen=strlen(s); tlen=strlen(t);//这两个长度应该设为全局变量最开始时求出,不能用一次求一次 get_nex(); kmp(); printf(\"%d\\n\",ans); }}","categories":[{"name":"字符串模板","slug":"字符串模板","permalink":"https://anoyer.cn/categories/字符串模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"Sunday算法模板","slug":"Sunday算法模板","date":"2018-09-17T15:47:27.000Z","updated":"2019-01-24T04:42:46.629Z","comments":true,"path":"article/Sunday算法模板.html","link":"","permalink":"https://anoyer.cn/article/Sunday算法模板.html","excerpt":"","text":"Sunday算法由Daniel M.Sunday在1990年提出,它的思想跟BM算法很相似:1只不过Sunday算法是从前往后匹配,在匹配失败时关注的是主串中参加匹配的最末位字符的下一位字符。如果该字符没有在模式串中出现则直接跳过,即移动位数 = 模式串长度 + 1;否则,其移动位数 = 模式串长度 - 该字符最右出现的位置(以0开始) = 模式串中该字符最右出现的位置到尾部的距离 + 1。1234567891011121314151617181920212223242526272829303132333435363738#include<stdio.h>#include<iostream>#include<algorithm>#include<string>#include<cstring>using namespace std;string s,p;int next_[257];void getnext(){ int len=p.size(); for(int i=0;i<256;i++)next_[i]=-1; for(int i=0;i<len;i++)next_[p[i]]=i; //打next_表,记录模式串相应字符的位置 }int sunday(){ int slen=s.size(); int plen=p.size(); if(slen==0)return -1; //如果s的长度为0,不需要匹配,直接返回-1 for(int i=0;i<slen-plen;){ int j=i; //s[j] int k=0; //p[k] for(;k<plen&&j<slen&&s[j]==p[k];j++,k++);//一直匹配,找到失配 j 和 k if(k==plen) //说明已经找到一段匹配串 return i; //如果要查找出现次数,改成cnt++ else{ if(i+plen<slen)i+=(plen-next_[s[i+plen]]); else return -1;// //如果要查找出现次数,改成return cnt } } return -1;}int main(){ s=\"I love DNF and Code\"; p=\"love\"; getnext(); if(sunday())printf(\"you find it at %d\\n\",sunday()); else printf(\"sorry,you do not find it!\\n\"); }","categories":[{"name":"字符串模板","slug":"字符串模板","permalink":"https://anoyer.cn/categories/字符串模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"字符串编辑距离模板","slug":"字符串编辑距离模板","date":"2018-09-17T15:40:35.000Z","updated":"2019-01-24T04:43:22.746Z","comments":true,"path":"article/字符串编辑距离模板.html","link":"","permalink":"https://anoyer.cn/article/字符串编辑距离模板.html","excerpt":"","text":"编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由⼀一个转成 另一个所需的少编辑操作次数。许可的编辑操作包括将⼀一个字符替换成另一个字符,插入一个字 符,删除一个字符12345678910111213141516171819202122232425#include<bits/stdc++.h>using namespace std;const int N = 1e3 + 5; int T, cas = 0; int n, m; int dp[N][N]; char s[N], t[N]; int main(){ while(scanf(\"%s%s\",s,t)!=EOF){ int n=(int)strlen(s),m=(int)strlen(t); for(int i=0;i<=n;i++){ dp[i][0]=i; } for(int i=0;i<=m;i++){ dp[0][i]=i; } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ dp[i][j]=min(dp[i-1][j],dp[i][j-1])+1; dp[i][j]=min(dp[i][j],dp[i-1][j-1]+(s[i-1]!=t[j-1])); } } printf(\"%d\\n\",dp[n][m]); }}","categories":[{"name":"字符串模板","slug":"字符串模板","permalink":"https://anoyer.cn/categories/字符串模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"Manacher回文串算法(马拉车)模板","slug":"Manacher回文串算法(马拉车)模板","date":"2018-09-17T15:37:45.000Z","updated":"2019-01-24T04:41:41.874Z","comments":true,"path":"article/Manacher回文串算法(马拉车)模板.html","link":"","permalink":"https://anoyer.cn/article/Manacher回文串算法(马拉车)模板.html","excerpt":"","text":"求一个串中最长回文串的长度给定一个字符串,求出其最长回文子串。例如:(1)s=”abcd”, 最长回文长度为 1;(2)s=”ababa”, 最长回文长度为 5;(3)s=”abccb”, 最长回文长度为 4,即 bccb。12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667#include<stdio.h> #include<iostream> #include<string.h>#include<algorithm> using namespace std;char s[111111];char s_new[111111*2];int p[111111*2];int Init(){ int len = strlen(s); s_new[0] = '$'; s_new[1] = '#'; int j = 2; for (int i = 0; i < len; i++) { s_new[j++] = s[i]; s_new[j++] = '#'; } s_new[j] = '\\0'; //别忘了哦 //printf(\"%s\\n\",s_new); return j; //返回s_new的长度 }int Manacher(){ int len = Init(); //取得新字符串长度并完成向s_new的转换 int maxLen = -1; //最长回文长度 int id; int mx = 0; for (int i = 1; i < len; i++) { if (i < mx) p[i] = min(p[2 * id - i], mx - i); //需搞清楚上面那张图含义, mx和2*id-i的含义 else p[i] = 1; while (s_new[i - p[i]] == s_new[i + p[i]]) //不需边界判断,因为左有'$',右有'\\0' p[i]++; //我们每走一步i,都要和mx比较,我们希望mx尽可能的远,这样才能更有机会执行if (i < mx)这句代码,从而提高效率 if (mx < i + p[i]) { id = i; mx = i + p[i]; } maxLen = max(maxLen, p[i] - 1); // printf(\"%d %d %d\\n\",mx,id,maxLen); } /*for(int i=1;i<=len;i++)printf(\"%d \",p[i]); printf(\"\\n\");*/ return maxLen;}int main(){ while (~scanf(\"%s\", s)) { printf(\"%d\\n\", Manacher()); } return 0;}","categories":[{"name":"字符串模板","slug":"字符串模板","permalink":"https://anoyer.cn/categories/字符串模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"拓展KMP模板","slug":"拓展KMP模板","date":"2018-09-17T15:31:25.000Z","updated":"2019-01-24T04:43:30.967Z","comments":true,"path":"article/拓展KMP模板.html","link":"","permalink":"https://anoyer.cn/article/拓展KMP模板.html","excerpt":"","text":"博主CSDN扩展KMPnext[i]表示为模式串S2中以i为起点的后缀字符串和模式串S2的最长公共前缀长度.extend[i]表示为以字符串S1中以i为起点的后缀字符串和模式串S2的最长公共前缀长度.12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152#include<bits/stdc++.h>using namespace std;const int maxn=100010;//字符串长度最大值 int next[maxn],ex[maxn];//ex数组即为extend数组char s[maxn],s2[maxn];int n;//预处理计算next数组void getnext(){ int i=0,j,po,len=strlen(s); next[0]=len;//初始化next[0] while(s[i]==s[i+1]&&i+1<len)//计算next[1] i++; next[1]=i; po=1;//初始化po的位置 for(i=2;i<len;i++){ if(next[i-po]+i<next[po]+po)//第一种情况,可以直接得到next[i]的值 next[i]=next[i-po]; else //第二种情况,要继续匹配才能得到next[i]的值 { j=next[po]+po-i; if(j<0)j=0;//如果i>po+next[po],则要从头开始匹配 while(i+j<len&&s[j]==s[j+i])//计算next[i] j++; next[i]=j; po=i;//更新po的位置 } } } //计算extend数组void extend(){ int i=0,j,po,len=strlen(s),l2=strlen(s2); getnext();//计算子串的next数组 while(s[i]==s2[i]&&i<len)i++; ex[0]=i; po=0;//初始化po的位置 for(i=1;i<len;i++){ if(next[i-po]+i<ex[po]+po) ex[i]=next[i-po];//第一种情况 else{ j=ex[po]+po-i; if(j<0)j=0;//如果j>ex[po]+po则从头开始匹配 while(i+j<len&&j<<l2&&s[j+i]==s2[j])//计算ex[i] j++; ex[i]=j; po=i; } } }int main(){}","categories":[{"name":"字符串模板","slug":"字符串模板","permalink":"https://anoyer.cn/categories/字符串模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"KMP最短公共祖先","slug":"KMP最短公共祖先","date":"2018-09-17T15:28:55.000Z","updated":"2019-01-24T04:41:33.503Z","comments":true,"path":"article/KMP最短公共祖先.html","link":"","permalink":"https://anoyer.cn/article/KMP最短公共祖先.html","excerpt":"","text":"HDU1841–题意是给出两个串,用这两个串组成一个新串,使新串包含这两个串,问这个新串的长度最小是多少,显然,对于两个串A,B,A如果是B的字串或者B如果是A的字串的话,直接输出那个母串的长度即可,如果没有这种关系,那么看一个串的后缀是否是另一个串的前缀如果某个串的后缀与另一个串的前缀的公共部分最长,则答案=A.length+B.length-公共长度。12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788#include<stdio.h>#include<algorithm>#include<iostream>#include<cstring> using namespace std; const int N = 1000100;char a[3][2*N];int fail[2*N];inline int max(int a, int b){ return (a > b) ? a : b;}int kmp(int &i, int &j, char* str, char* pat){ int k; memset(fail, -1, sizeof(fail)); for (i = 1; pat[i]; ++i) { for (k = fail[i - 1]; k >= 0 && pat[i] != pat[k + 1]; k = fail[k]); if (pat[k + 1] == pat[i]) { fail[i] = k + 1; } } i = j = 0; while (str[i] && pat[j]) { if (pat[j] == str[i]) { i++; j++; } else if (j == 0) { i++; } else { j = fail[j - 1] + 1; } } if (pat[j]) { return -1; } else { return i - j; }}int main(int argc, const char * argv[]){ int T; scanf(\"%d\", &T); while (T--) { int i, j, l1 = 0, l2 = 0; cin >> a[0] >> a[1]; int len1 = (int)strlen(a[0]), len2 = (int)strlen(a[1]), val; val = kmp(i, j, a[1], a[0]); if (val != -1) { l1 = len1; } else { if (i == len2 && j - 1 >= 0 && a[1][len2 - 1] == a[0][j - 1]) { l1 = j; } } val = kmp(i, j, a[0], a[1]); if (val != -1) { l2 = len2; } else { if (i == len1 && j - 1 >= 0 && a[0][len1 - 1] == a[1][j - 1]) { l2 = j; } } printf(\"%d\\n\", len1 + len2 - max(l1, l2)); } return 0;}","categories":[{"name":"字符串模板","slug":"字符串模板","permalink":"https://anoyer.cn/categories/字符串模板/"}],"tags":[{"name":"ACM模板","slug":"ACM模板","permalink":"https://anoyer.cn/tags/ACM模板/"}]},{"title":"Hello World","slug":"hello-world","date":"2018-09-17T13:40:12.000Z","updated":"2018-12-02T06:44:04.838Z","comments":true,"path":"article/hello-world.html","link":"","permalink":"https://anoyer.cn/article/hello-world.html","excerpt":"","text":"Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.Quick StartCreate a new post1$ hexo new \"My New Post\"More info: WritingRun server1$ hexo serverMore info: ServerGenerate static files1$ hexo generateMore info: GeneratingDeploy to remote sites1$ hexo deployMore info: Deployment","categories":[{"name":"Hexo","slug":"Hexo","permalink":"https://anoyer.cn/categories/Hexo/"}],"tags":[{"name":"Hexo","slug":"Hexo","permalink":"https://anoyer.cn/tags/Hexo/"}]},{"title":"文章模板","slug":"模板","date":"2018-03-01T13:46:12.000Z","updated":"2018-12-02T06:37:05.230Z","comments":true,"path":"article/模板.html","link":"","permalink":"https://anoyer.cn/article/模板.html","excerpt":"","text":"","categories":[],"tags":[]}]}