AcWing 141. 周期
原题链接
简单
作者:
Dream_zsh
,
2021-07-18 18:31:43
,
所有人可见
,
阅读 323
#include<iostream>
using namespace std;
const int N= 1e6+10;
int n,t;
int ne[N];
char a[N];
int main()
{
while(cin >>n,n)
{
cin >>a+1;
printf("Test case #%d\n",++t);
//next[]数组求法
for(int i=2,j=0;i<=n;i++)
{
while(j&&a[i]!=a[j+1]) j=ne[j];
if(a[i]==a[j+1])j++;
ne[i]=j;
}
for(int i=2;i<=n;i++)//从2开始枚举
if(i%(i-ne[i])==0&&ne[i])//是循环(%==0)才输出 判断时还要注意next[i]是否为0
printf("%d %d\n",i,i/(i-ne[i]));//输出i的长度(即i) 以及最大循环次数(一个小循环的长度i-nex[i])
printf("\n");//还需输出一个空行
}
}