Language: Default Period
Description 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 Input The input 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. Output 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 Sample Input 3 aaa 12 aabaabaabaab 0 Sample Output Test case #1 2 2 3 3 Test case #2 2 2 6 2 9 3 12 4 Source |
题意:让求哪个子串是由重复的几个串组成的。
解题思路:
next数组~~
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <algorithm> #define maxn 1000000+10 using namespace std; int next[maxn]; char P[maxn]; int N; void getnext() { int i=0,j=-1; next[0]=-1; while(i<N){ if(j==-1||P[i]==P[j]) next[++i]=++j; else j=next[j]; } } int main() { int xp=1; while(scanf("%d",&N),N){ memset(next,0,sizeof(next)); scanf("%s",P); getnext(); int l; printf("Test case #%d\n",xp++); for(int i=2;i<=N;i++){ l=i-next[i]; if((i%l==0)&&(i/l!=1)){ printf("%d %d\n",i,i/l); } } printf("\n"); } return 0; }
版权声明:本文为博主原创文章,转载请注明出处。