Today learned KMP algorithm ......
Content not want to write too long:
http://www.matrix67.com/blog/archives/115
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #define maxn 1000010 6 using namespace std; 7 char a[maxn],b[maxn]; 8 int n,m,i,j,kmp[maxn]; 9 int main() 10 { 11 cin>>a+1; 12 cin>>b+1; 13 n=strlen(a+1); 14 m=strlen(b+1); 15 j=0; 16 kmp[1]=0; 17 for(int i=2;i<=m;i++) 18 { 19 while(j>0&&b[i]!=b[j+1])j=kmp[j]; 20 if(b[i]==b[j+1])j++; 21 kmp[i]=j; 22 } 23 j=0; 24 for(int i=1;i<=n;i++) 25 { 26 while(j>0&&a[i]!=b[j+1])j=kmp[j]; 27 if(a[i]==b[j+1])j++; 28 if(j==m) 29 { 30 printf("%d\n",i-m+1); 31 j=kmp[j]; 32 } 33 } 34 for(int i=1;i<=m;i++)printf("%d ",kmp[i]); 35 return 0; 36 }