题目描述
For each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive), we want to know whether the prefix is a periodic string. That is, for each i (2 <= i <= N) we want to know
the largest K > 1 (if there is one) such that the prefix of S with length i can be written as A K , that is A concatenated K times, for some string A.
Of course, we also want to know the period K.
输入描述:
The input file consists of several test cases. Each test case consists of two lines. The first one contains N (2 <= N <= 1 000 000) � the size of the string S. The second line contains the string S. The input file ends with a line, having the number zero on it.
输出描述:
For each test case, output “Test case #” and the consecutive test case number on a single line; then, for each prefix with length i that has a period K > 1, output the prefix size i and the period K separated by a single space; the prefix sizes must be in increasing order. Print a blank line after each test case.
示例1
输入
3 aaa 12 aabaabaabaab 0
输出
Test case #1 2 2 3 3 Test case #2 2 2 6 2 9 3 12 4
#include<stdio.h> #include<string.h> int next[1000005],n; char s[1000005]; void getnext(char *s) { int i,j; memset(next,0,sizeof(next)); next[0]=-1; i=0; j=-1; while(i<n) { if(j==-1||s[i]==s[j]) { i++; j++; next[i]=j; } else j=next[j]; } } int main() { int c=0; while(scanf("%d",&n)!=EOF,n) { int i; scanf("%s",s); getnext(s); printf("Test case #%d\n",++c); for(i=2;i<=n;i++) { int len=i-next[i]; if(i%len==0&&i/len>1) { printf("%d %d\n",i,i/len); } } printf("\n"); } }