正题
洛谷评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=UVA1328
POJ链接:http://poj.org/problem?id=1961
题目大意
求一个字符串每个前缀的最短循环循环次数。
解题思路
计算next数组,然后直接计算循环节:
详见:POJ2752-Seek the Name, Seek the Fame【KMP】
code
#include<cstdio>
using namespace std;
int n,fail[1000001],k;
char s[1000001];
int main()
{while(true){++k;scanf("%d",&n);if(n==0) return 0;scanf("%s",s);for(int i=1,j=0;i<n;i++){while(j&&s[i]!=s[j])j=fail[j];j+=(s[i]==s[j]);fail[i+1]=j;}//构建失败指针printf("Test case #%d\n",k);for(int i=2;i<=n;i++){if(i/(i-fail[i])>1&&!(i%(i-fail[i]))) printf("%d %d\n",i,i/(i-fail[i]));//输出答案}printf("\n");}
}