KMP
Dan__ge
Today is difficult,tomorrow is more difficult,but the day after is beautiful.
展开
-
HDU 3336 数据结构之KMP
点击打开链接 题意:t组数据,每组开头一个n,然后一个长度为n的字符串,问以第一个为串的数量到以整个串为串的数量的和,最后对10007取余 思路:用KMP的next数组保存就行了next数组存的是与开头进行匹配的可以匹配到的位置,如abab,则next数组为0 0 1 2,第三个的1表示从头匹配的匹配到的位置,第四个数就是4了,然后从头到尾扫一遍,直到next数组为0为止,每一次加1#incl原创 2016-03-21 18:28:55 · 747 阅读 · 0 评论 -
HDU 3746 数据结构之KMP
点击打开链接 题意:给T组数据,每组一个字符串,问最少添加多少个字符可以使这个串变成一个子串连续出现的串 思路:利用KMP的next数组进行变换,next数组保存的是目前为止与字符串从头开始的匹配的程度,也可以看成从头开始的位置,所以如果Next数组最后一个为0,则需要在添加一个这样的串才能匹配成功,不然ans=len-Next[len]代表的是不能匹配的后面的串的长度,如果这个长度可以被le原创 2016-03-22 12:41:36 · 894 阅读 · 0 评论 -
HDU 4763 数据结构之KMP+二分
点击打开链接 题意:求最长的开头与结尾,然后中间还有一样的,但是不能重复利用一个字符 思路:用KMP的next数组,然后用二分求最大值,具体看二分就行了#include #include #include #include #include using namespace std; typedef long long ll; const int inf=0x3f3f3f3f; con原创 2016-03-22 20:45:47 · 709 阅读 · 0 评论 -
扩展KMP的模版
记录模版,以后好好学习 #include #include #include #include #include using namespace std; const int maxn=100005; int next[maxn],extand[maxn]; char S[maxn],T[maxn]; void GetNext(const char *T){ int len=原创 2016-03-24 11:00:20 · 628 阅读 · 0 评论 -
ZOJ 3587 扩展KMP应用
点击打开链接 题意:给定两个串,问从第一个串取出连续的两段,合并后可以拼成第二个的方法总数,这两段可以有重叠的部分 思路:用扩展KMP求出extand数组,不懂KMP的可以看这篇点击打开链接,解释的很详细,extand[i](0=1,第一个字符的可能性就+1;第二个也一样,只要extand[i]>=2就+1;后面的情况我们可以将字符串反过来扩展KMP一次,求得结果与前面的意义相同,看代码吧,对原创 2016-03-24 18:25:29 · 903 阅读 · 0 评论 -
HDU 2594 数据结构之KMP
点击打开链接 题意:输入两个串,求第一个串的头和第二个串的尾匹配的最长长度 思路:用KMP的next数组,将两个串合并之后求Next数组,合并后的长度为len,Next[len]代表的就是第二个串和第一个串的匹配程度,讨论后输出#include #include #include #include #include using namespace std; typedef long原创 2016-03-22 13:06:54 · 831 阅读 · 1 评论 -
HDU 4333 扩展KMP
点击打开链接 题意:一个数字,依次将第一位放到最后一位,问小于本身的数的个数及等于本身的个数和大于本身的个数,但是要注意重复的不再计算 思路:用扩展KMP我们可以处理,先将串复制到后面一次,然后求扩展KMP,那么我们如何比较呢,如果extand[i]的值大于串的长度len,说明我以i为开头的串和原串的匹配大于len,也就说明这个串和原串相等,接下来就是另外两种情况,若extand[i]匹配到了原创 2016-05-12 20:44:32 · 4274 阅读 · 0 评论