Period kmp
阿新 • • 發佈:2019-04-09
pac bits memset span times class string ref long , that is A concatenated K times, for some string A. Of course, we also want to know the period K.
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 order. Print a blank line after each test case.
Sample Input
3
aaa
12
aabaabaabaab
0
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 AK
Input 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.
Sample Output Test case #1 2 2 3 3 Test case #2 2 2 6 2 9 3 12 4 這題 需要對next數組具有更深的理解 就很好做了 仔細觀察next即可
#include<bits/stdc++.h> using namespace std; //input #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);i--) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m); #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define inf 0x3f3f3f3f #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// #define N 1000000+5 int nex[N]; int lenp; string p; void getnext() { lenp=p.size(); nex[0]=-1; int k=-1,j=0; while(j<lenp) { if(k==-1||p[j]==p[k]) nex[++j]=++k; else k=nex[k]; } } int main() { int n; int cas=0; while(RI(n),n) { if(!n)break; printf("Test case #%d\n",++cas); cin>>p; getnext(); rep(i,1,lenp) { if(nex[i]==0)continue; int j=i-nex[i]; if(i%j==0) { printf("%d %d\n",i,i/j); } } cout<<endl; } }View Code
Period kmp