141 周期 打个卡复习用
作者:
暖心男神2
,
2021-03-23 16:10:06
,
所有人可见
,
阅读 286
// 用到next数组的周期性
// 结论就是对于字符串s[1~i] next[i]
// 满足 i % (i−next[])==0 ,那么就可以
// 肯定S[1~ (i−next[i])]是 S[1~i] 的最小循环元,而
// i/(i−next[i]) 即是它的最大循环次数 K ,
#include<iostream>
#include<cstring>
using namespace std;
const int N=1e6+10;
char a[N];
int ne[N];
int main(){
int n;
int t=1;
while(cin>>n,n){
cin>>a+1;
int j=0;
for(int i=2;i<=n;i++){
while(j&&a[i]!=a[j+1]) j=ne[j];
if(a[i]==a[j+1]) j++;
ne[i]=j;
}
printf("Test case #%d\n",t++);
for(int i=2;i<=n;i++){
if(i%(i-ne[i])==0&&ne[i])//判断时还要注意ne[i]是否为0
printf("%d %d\n",i,i/(i-ne[i]));
}
cout<<endl;
}
}