http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=10758
思路:KMP,next表示模式串如果第i位(设str[0]为第0位)与文本串第j位不匹配则要回到第next[i]位继续与文本串第j位匹配。则模式串第1位到next[n]与模式串第n-next[n]位到n位是匹配的。所以思路和上面一样,如果n%(n-next[n])==0,则存在重复连续子串,长度为n-next[n]。
例如:a b a b a b
next:-1 0 0 1 2 3 4
next[n]==4,代表着,前缀abab与后缀abab相等的最长长度,这说明,ab这两个字母为一个循环节,长度=n-next[n];
#include<iostream> #include<string.h> using namespace std; int next[1000005]; char s[1000005]; void getnext() { int i=0,j=-1; next[0]=-1; int len=strlen(s); while(i<len) { if(s[i]==s[j]||j==-1) { i++; j++; next[i]=j; } else j=next[j]; } } int main() { while(scanf("%s",s)>0) { if(s[0]=='.') break; int len=strlen(s); getnext(); if(len%(len-next[len])==0) printf("%d\n",len/(len-next[len])); else printf("1\n"); } return 0; }