题目:前缀中的周期
用nex数组来表示字符串每个字符i的特征数,即P(0...i-1)中最大的相同前缀子串和后缀子串。
对于有i个字符的字符串P,有循环节的充分必要条件应该是i%(i-nex[i-1)=0,并且循环节的个数为i/(i-nex[i-1])。
代码如下:
#include<iostream>
#include<queue>
#include<stack>
#include<cmath>
#include<functional>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int nex[1000010];
char a[1000010];
void init_next(int len){
nex[0]=0;
int k;
for(int i=1;i<len;i++){
k=nex[i-1];
while(a[i]!=a[k] && k>0){
k=nex[k-1];
}
if(a[i]==a[k]) nex[i]=k+1;
else nex[i]=0;
}
}
int main(){
int len;
int cnt=1;
while(cin>>len && len){
cin>>a;
init_next(len);
printf("Test case #%d\n",cnt++);
for(int i