字符串模板--KMP

匿名 (未验证) 提交于 2019-12-02 23:51:01



 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 }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!