pku 1961 Period(KMP next数组应用)
//188MS
#include <stdio.h>
#define MAXN 1000005
char str[MAXN];
int next[MAXN];
void getNext(int len)
{
int j=0,k=-1;
next[0]=-1;
while(j<len)
{
if( k == -1 || str[j] == str[k] )
{
++j;
++k;
next[j] = k;
int t = ( j ) / ( j - k );
if( t != 1 && t*(j-k) == j) printf("%d %d\n",j,t);
}
else k=next[k];
}
}
int main()
{
int len,cas=1;
while(scanf("%d",&len),len)
{
scanf("%s",str);
printf("Test case #%d\n",cas++);
getNext(len);
printf("\n");
}
}
浙公网安备 33010602011771号