Period UVA - 1328
题意:
给你一个串。要求你计算每个前缀是否可以由一个循环节,重复k次得到(k>1)
思路:
就是模板题。
后缀函数的定义,“错位部分”长度为
i
−
n
e
x
t
[
i
]
i-next[i]
i−next[i].
如果这
i
i
i个字符串组成一个周期串,那么“错位”部分恰好就是一个循环节。
条件
.
- k>1.
- k ( i − n e x t [ i ] ) = i k(i-next[i])=i k(i−next[i])=i
证明
AC
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
const int maxn=1e6+10;
int nxt[maxn];
char s[maxn];
void getnxt(char *p){
int m = strlen(p);
int i=0,j=-1;
nxt[0]=-1;
while(i<m){
if(j==-1||p[i]==p[j])nxt[++i]=++j;
else j=nxt[j];
}
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int n,kase=0;
while(cin>>n&&n){
cin>>s;
getnxt(s);
cout<<"Test case #"<<++kase<<endl;//1"
for(int i=2; i<=n; i++){
if(nxt[i]>0 && i%(i-nxt[i])==0)cout<<i<<' '<<i/(i-nxt[i])<<endl;
}
cout<<endl;
}
return 0;
}
/*
3
aaa
12
aabaabaabaab
0
*/