KMP
AC之路有笑有泪
搞ACM挺好的,就是头有点冷。
展开
-
HDU 1711 Number Sequence KMP模板
http://acm.hdu.edu.cn/showproblem.php?pid=1711Number SequenceTime Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 26895 Accepted Su原创 2017-06-19 20:05:50 · 282 阅读 · 0 评论 -
HDU 3746 Cyclic Nacklace KMP求字符串最小循环节长度
题意:一个字符串,必须要有的重复串组成(至少重复两次),现在问在串的最后面至少填多少字母才能满足要求。思路:先求出循环节的长度。利用KMP的nex数组求出循环节长度。举个栗子:abcdeabcdeab 长度L=12,nex[12]=7,x=L-nex[L]=5就是一个循环节的长度,用5-L%5就是答案了。如果nex[L]=0,答案就是L。原创 2017-06-19 20:42:26 · 759 阅读 · 0 评论 -
HDU 3068 最长回文 Manacher算法O(n)回文子串算法
题意:找出字符串中最长的回文串,输出其长度。思路:Manacher算法O(n)回文子串算法,http://blog.csdn.net/xingyeyongheng/article/details/9310555这篇博客讲的很清楚,虽然我刚开始也是一脸迷茫,不知道他写的是啥,要想学会这个算法,你就最好自己模拟代码,博客里有栗子,自己手推吧。http://blog.csdn.net/ggggiqnypgjg/article/details/6645824这篇博客也挺好的有一点开始的时候一直不明白,这里我原创 2017-06-20 12:58:18 · 433 阅读 · 0 评论 -
HDU 2594 两串合为一串,利用nex数组巧解
题意:在第一个串里找个前缀,在第二个串里找个后缀,使得这两个缀相同,输出这个缀,和长度思路:先把两个串合成一个串,然后求出新串的nex数组,只是nex数组求法稍作修改即可,注意1:nex的值不可以大于第一个串的长度。若大于则执行x=nex[x]; (细细品味)2:第二个串的第一个字母一定要从第一个串的第一个字母开始匹配。if(y==la) x=0;上面的两条跟下面的样例是对应的。其他的东西跟就模板一样了。样例:Sample InputaabaabaabaaabcabcabcSamp原创 2017-06-20 17:08:10 · 432 阅读 · 0 评论 -
HDU 3336 Count the string (KMP的nex数组)
题意:和字符串前缀一样的子串有多少个。题目里样例解释的很清楚。思路:这道题主要是找规律,我用b[i]表示前i位所有符合条件的串的个数。ans统计答案。利用k=nex[i]能得到前缀和后缀相同的长度为k(新增加的串是后缀(只有后缀里才有与前缀相同的串),他和前缀相同,所以后缀包含的复合条件的串有b[k]个)。这样第i位的出现就增加了一个前缀(长度为k的串)里所有的符合条件的串的个数,第i位的出现使得ans增加了b[k]+1个符合条件的串,这个1是当前的串本身。b数组随着nex数组更新,再用ans求和就可原创 2017-06-20 20:14:23 · 285 阅读 · 0 评论 -
HDU 4300 Clairewd’s message (KMP的nex数组应用)
重点是题意:我个菜鸡看了半天也没看懂0.0,现在第一行给你26个字母,这是字母的加密规则,例如:qwertyuiopasdfghjklzxcvbnm abcdefghijklmnopqrstuvwxyz这是字母的加密规则(将明文中所有的q都变成a,所有的w都变成b,以此类推),明文(初始的串),密文(加密后的串)第二行给你一个串,这个串是由密文(是由明文加密后得来的)+明文组成的(密文长度一定大于等于明文),密文一定是完整的,但是明文不一定是完整的。你并不知道明文有多长,所以题意让你输出补原创 2017-06-20 21:52:39 · 315 阅读 · 0 评论 -
HDU 1238 Substrings kmp暴力枚举
题意 :现在有好多字符串,让你求他们的最长公共字符串,还有一个条件是:如果这个串只要有这个子串,或者是这个子串的倒序都可以(第二个样例很清楚,原串中or和ro只要有一个就可以)。思路:因为这种题的数据量都不大所以,暴力枚举即可,枚举第一个串里所有的子串,每次用kmp求出这个串是否存在于其他串(正序或倒序)。原创 2017-06-21 15:38:43 · 300 阅读 · 0 评论 -
HDU 3374 KMP-最小最大表示法的原理详解
题意:在这些可以得到的字符串中,字典序最大的字符串在第几个出现,出现了几次。最小的字符串亦然。思路:刚学会这个代码,重点是代码有一个地方不好搞明白(一会儿重点解释代码的原理,自己想的原理,我也不知道对不对大笑)。出现的次数应该都能想到,求出字符串的最小周期x是多少。 int p=1; if(ls%(ls-nex[ls])==0)//ls-nex[ls]为循环节。ls为串长度 p=ls/(ls-nex[ls]);p即为次数。怎么求最大(小)的子串原创 2017-07-03 11:49:46 · 416 阅读 · 0 评论