[POJ1961]Period (KMP)
阿新 • • 發佈:2018-12-30
題意
求字串s的最小迴圈元長度和迴圈次數
思路
s[1~i]滿足迴圈元要len能整除i並且s[len+1~i]=s[1~i-len]
程式碼
#include<cstdio> #include<algorithm> #include<cstring> #define N 1000005 using namespace std; char s[N]; int next[N]; int n,T; int len; void kmp() { next[1]=0; for(int i=2,j=0;i<=len;i++) {while(j>0&&s[i]!=s[j+1]) j=next[j]; if(s[i]==s[j+1]) j++; next[i]=j; } } int main() { while(scanf("%d",&n)==1&&n) { scanf("%s",s+1); len=strlen(s+1); kmp(); printf("Test case #%d\n",++T); for(int i=2;i<=n;i++) { if(i%(i-next[i])==0 && i/(i-next[i])>1) printf("%d %d\n",i,i/(i-next[i])); } puts(""); } return 0; }