目录:
题目:
分析:
通过普通的 KMP K M P 算法求出 next n e x t 数组,然后根据 nexti n e x t i 求出 1 1 ——的循环元,同理,在循环元中求出最小循环元即可
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<set>
#include<map>
#include<list>
#include<ctime>
#include<iomanip>
#include<string>
#include<bitset>
#define LL long long
using namespace std;
inline LL read() {
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
return d*f;
}
char s[1000001];
int nex[1000001];
int main()
{
int king=0;
int n=read();
while(n)
{
scanf("%s",s+1);
nex[1]=0;
int j=0;
for(int i=2;i<=n;i++)
{
while(j&&s[i]!=s[j+1]) j=nex[j];
j+=(s[i]==s[j+1]);
nex[i]=j;
}
printf("Test case #%d\n",++king);
for(int i=2;i<=n;i++)
if(i%(i-nex[i])==0&&i/(i-nex[i])>1)
printf("%d %d\n",i,i/(i-nex[i]));
puts("");
n=read();
}
return 0;
}