1 void getnext() 2 { 3 int k=-1,i=0; 4 nxt[0]=-1; 5 while(i<lent){ 6 while(k>=0&&t[k]!=t[i]) 7 k=nxt[k]; 8 i++,k++; 9 nxt[i]=k; 10 } 11 }
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 #define e exit(0) 6 #define R register 7 const int maxn=1e6+10; 8 char s[maxn],t[maxn]; 9 int lens,lent,deep,nxt[maxn],pos[maxn]; 10 void getnext() 11 { 12 int k=-1,i=0; 13 nxt[0]=-1; 14 while(i<lent){ 15 while(k>=0&&t[k]!=t[i]) 16 k=nxt[k]; 17 i++,k++; 18 nxt[i]=k; 19 } 20 } 21 void kmp() 22 { 23 int i=0,j=0; 24 while(j<lens){ 25 while(i>=0&&t[i]!=s[j]) 26 i=nxt[i]; 27 i++,j++; 28 if(i==lent){ 29 pos[++deep]=j-lent+1; 30 } 31 } 32 } 33 int main() 34 { 35 // freopen("s.in","r",stdin); 36 // freopen("s.out","w",stdout); 37 scanf("%s",s),scanf("%s",t); 38 lens=strlen(s),lent=strlen(t); 39 getnext(); 40 kmp(); 41 for(R int i=1;i<=deep;++i) 42 printf("%d\n",pos[i]); 43 for(R int i=1;i<=lent;++i) 44 printf("%d ",nxt[i]); 45 return 0; 46 }