题意:给出一个字符串S,对于每一个0到N的i,要求找一个最大的k,满足S的长度为i的前缀,可以写成一个循环节整好循环k次,对于每一个符合条件的i和k,输出i和k。
刚刚做了循环节,拿这题来练手,关于循环节的计算方法,请点击传送门。
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int M = 1e6+5;
char t[M];
int Next[M];
int m;
void kmp_pre()
{
memset(Next,0,sizeof(Next));
int i,j;
Next[0]=j=-1;
i=0;
while(i<m)
{
while(j!=-1 && t[i]!=t[j])
j=Next[j];
Next[++i]=++j;
}
}
int main()
{
int ks=1;
while(scanf("%d",&m),m)
{
scanf("%s",t);
printf("Test case #%d\n",ks++);
kmp_pre();
for(int i=1;i<=m;i++)
{
if(i>(i-Next[i]) && i%(i-Next[i])==0)
{
int k=i/(i-Next[i]);
printf("%d %d\n",i,k);
}
}
putchar('\n');
}
return 0;
}