题目链接:http://acm.hust.edu.cn/problem/show/1010
KMP失配指针的利用:
next数组前缀和后缀最长公共长度,这样len - next[len];就是最短的循环节点。

#include <stdio.h> #include <string.h> using namespace std; #define maxn 1000005 void getFail(char *P,int *f) { int m = strlen(P); f[0] = 0; f[1] = 0; for(int i=1; i<m; i++) { int j = f[i]; while(j&&P[i]!=P[j]) j = f[j]; if(P[i]==P[j]) f[i+1] = j+1; else f[i+1] = 0; } } void find(char *T,char *P,int *f) { int n = strlen(T); int m = strlen(P); getFail(P,f); int j = 0; for(int i=0; i<n; i++) { while(j&&P[j]!=T[i]) j = f[j]; if(P[j]==T[i]) j++; if(j==m) printf("%d ",i-m+1); } } int main() { char str[maxn]; while(~scanf("%s",str)) { int f[maxn] = {0}; getFail(str,f); int len = strlen(str); printf("%d ",len-f[len]); } return 0; }