題目連接:http://acm.fzu.edu.cn/problem.php?pid=1901php
給你一個字符串 s 求出全部知足s[i] == s[i+p] ( 0 < i+p < len )的 p ;算法
kmp中Next[i] 表示前i個字符的前綴和後綴的最大匹配 s[0--x] == s[i-x-1 --- i] ;數組
下面是看別人的解釋:ide
#include<stdio.h> #include<string.h> #include<algorithm> #include<stdlib.h> using namespace std; const int N = 1e6+7; char s[N]; int Next[N], ans[N]; void GetNext(char a[], int n) { int i=0, j=-1; Next[0] = -1; while(i<n) { if(j==-1 || a[i]==a[j]) Next[++i] = ++j; else j = Next[j]; } } int main() { int T, t=1, k, len; scanf("%d", &T); while(T--) { scanf("%s", s); len = strlen(s); GetNext(s, len); k = 0; for(int j=len; j>0; j=Next[j]) ans[k++] = len - Next[j]; printf("Case #%d: %d\n", t++, k); for(int i=0; i<k; i++) printf("%d%c", ans[i], i==k-1?'\n':' '); } return 0; }