#include<iostream>
#include<stdio.h>
#include<string.h>
#include<string>
using namespace std;
char str[1000010];
int *Next;
int n;
void findNext(char *p){
if(Next != NULL){
delete[]Next;
}
Next = new int [n+1];
int i = 3, k;
Next[0] = -1;
Next[1] = 0;
if(n >= 3){
if(p[0] == p[1]){
Next[2] = 1;
}
else{
Next[2] = 0;
}
}
k = Next[2];
while(i <= n){ //next[i-1]=k
if(p[i-1]==p[k]){
++k;
Next[i] = k;
++i;
continue;
}
while(p[i-1] != p[k] && k != 0){
k = Next[k];
}
if(p[i-1] != p[k] && k == 0){
Next[i] = 0;
++i;
}
}
}
int main(){
//freopen("1.txt","r",stdin);
int l, i = 2,temp,Case = 1;
while(scanf("%d",&n)&&n){
printf("Test case #%d\n",Case++);
scanf("%s",str);
findNext(str);
i = 2;
while(i <= n){
temp = i - Next[i];
if(temp > 0 &&(!( i % temp))){
if(i / temp >= 2){
printf("%d %d\n",i,i/temp);
}
}
++i;
}
printf("\n");
}
if(Next != NULL){
delete [] Next;
}
return 0;
}
poj 1961 Period
最新推荐文章于 2022-07-21 20:47:48 发布