K - 卿大爷的三个女友 KMP、跳转数组
Source
2016 UESTC Training for Search Algorithm & String
My Solution
关键在于KMP思维的转化。思维很重要!先用文本串做个跳转数组。
设文本串长度为len。
我们考虑匹配第len个位置。跳转数组每跳一个位置。
都能保证文本串的前缀==后缀,可以自己手动模拟画个看看。
故只需在剩下的中间部分找有没有匹配的子串即可。
一旦找到了就好了,这个就是最长的了^_^。
复杂度 O(T*n)
#include
#include
#include
using namespace std;
const int maxn=1e5 + 8;
int nxt[maxn], len;
char text[maxn];
void getnxt(char *p)
{
nxt[1] = 0;
for(int i = 1, j = 0; i < len; i++){
j = nxt[i];
while(j && p[j] != p[i])
j = nxt[j];
nxt[i+1] = p[j] == p[i] ? j+1 : 0; //在这里进行初始化了, 故用的时候不要memset了
}
}
bool kmp(char *T,char *P,int n,int m)
{
for(int i=0, j=0; i < n; i++){ while(j && P[j] != T[i]) j = nxt[j]; if(P[j] == T[i]) j++; if(j == m) return true; } return false; } int main() { #ifdef LOCAL freopen("a.txt", "r", stdin); #endif // LOCAL int T,j,ans; scanf("%d",&T); while(T--){ ans=0; scanf("%s",text); len=strlen(text); getnxt(text); j = nxt[len]; while(j){ if(len >= 3*j&& kmp(text+j, text, len-2*j, j)){
ans=j;
break;
}
j = nxt[j];
}
printf("%dn",ans);
}
return 0;
}
非特殊说明,本博所有文章均为博主原创,未经许可不得转载。
https://www.prolightsfxjh.com/
Thank you!
------from ProLightsfx
非特殊说明,本博所有文章均为博主原创,未经许可不得转载。
如经许可后转载,请注明出处:https://prolightsfxjh.com/article/2016-uestc-training-for-search-algorithm-string-k/
共有 0 条评论