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; }