嘿嘿,以前写的,刚刚突然看到的,就贴一下咯,KMP 的求next[]数组的活用,求最长重复字串
pku2406
#include <stdio.h> #include <stdlib.h> #include <string.h> char str [1000010]; int next[1000010]; int getnext() { int i= 0, j= -1; next[0]= -1; while( str[i] )//这个过程其实就是在求next[]数组 { if( j== -1 || str[i]== str[j] ) { ++i,++j; next[i]= j; } else j= next[j]; } int len= strlen(str); i= len- j; if( len% i== 0 ) return len/ i; else return 1; } int main() { while( gets( str), str[0]!= '.' ) printf("%d\n", getnext() ); return 0; }
pku 1961
#include<iostream> #include<string.h> using namespace std; char str[1000010]; int net[1000010],len; void get_next() { net[0]=-1; int i=0,j=-1; while(str[i]) { if(j==-1 || str[i]==str[j]) { i++;j++; net[i]=j; } else j=net[j]; } } int main() { int cas=0; while(scanf("%d",&len)==1 && len) { scanf("%s",str); printf("Test case #%d\n",++cas); get_next(); for(int i=2;i<=len;i++) { int k=i-net[i]; if(i%k==0 && i/k >=2) printf("%d %d\n",i,i/k); } puts(""); } return 0; }
hdu 3746 Cyclic Nacklace
View Code
#include<iostream> #include<algorithm> using namespace std; const int N = 100000+10; char p[N]; int nxt[N],m; void get_next() { nxt[0]=-1; int k=-1; for(int i=1;i<=m-1;i++) { while(k>-1 && p[k+1] !=p[i]) k=nxt[k]; if(p[k+1]==p[i]) ++k; nxt[i]=k; } } int main() { int T; scanf("%d",&T); while(T--) { scanf("%s",p); m=strlen(p); get_next(); int len=m-nxt[m-1]-1; if(len!=m && m%len==0) printf("0\n"); else printf("%d\n",len-m%len); } return 0; }