http://acm.hdu.edu.cn/showproblem.php?pid=2594
扩展KMP
View Code
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 5 const int N=50010; 6 char s1[N],s2[N]; 7 int next[N],ext[N]; 8 void getnext(char *sp) 9 { 10 next[0]=strlen(sp); 11 int p=0; 12 while(sp[p+1] && sp[p]==sp[p+1]) p++; 13 next[1]=p; 14 for(int i=2,k=1;sp[i];i++) 15 { 16 if(next[i-k]+i>=next[k]+k) 17 { 18 int j=next[k]+k-i; 19 if(j<0) j=0; 20 while(sp[j+i] && sp[j]==sp[j+i]) j++; 21 next[k=i]=j; 22 } 23 else next[i]=next[i-k]; 24 } 25 } 26 void exkmp(char *st,char *sp) 27 { 28 int p=0; 29 while(st[p] && st[p]==sp[p]) p++; 30 ext[0]=p; 31 for(int i=1,k=0;st[i];i++) 32 { 33 if(next[i-k]+i>=ext[k]+k) 34 { 35 int j=ext[k]+k-i; 36 if(j<0) j=0; 37 while(st[j+i] && st[j+i]==sp[j]) j++; 38 ext[k=i]=j; 39 } 40 else ext[i]=next[i-k]; 41 } 42 } 43 int main() 44 { 45 while(~scanf("%s%s",s1,s2)) 46 { 47 getnext(s1); 48 exkmp(s2,s1); 49 int len2=strlen(s2); 50 int i; 51 for(i=0;s2[i];i++) 52 if(i+ext[i]==len2) break; 53 if(i<len2) printf("%s ",s2+i); 54 printf("%d\n",len2-i); 55 } 56 return 0; 57 }