中南大学-1239: 审阅文稿//kmp

来源:互联网 发布:顶级用餐体验 知乎 编辑:程序博客网 时间:2024/04/29 04:40

再次了解kmp!

#include<iostream>#include<stdio.h>#include<string.h>using namespace std;char st1[20001],st2[12000001];int next[1000001];bool equ(int i,char a[],int j,char b[]){if(a[i]==b[j]&&a[i+1]==b[j+1]) return true;return false;}void getnext(){int i,j,len=strlen(st1);next[0]=-2;i=0;j=-2;while(i<len){if(j==-2||equ(i,st1,j,st1)){i+=2;j+=2;//++i;++j;if(!equ(i,st1,j,st1)) next[i>>1]=j;else next[i>>1]=next[j>>1];}else j=next[j>>1];}}void kmp(){int i=0,j=0;getnext();int l1=strlen(st1),l2=strlen(st2);int ans=0;while(i<l2){if(j==-2||equ(j,st1,i,st2))i+=2,j+=2;else j=next[ j>>1 ];if(j==l1) ++ans,j=next[j>>1];}cout<<ans<<endl;}int main(){while(scanf("%s",st1)!=EOF){scanf("%s",st2);kmp();}return 0;}


原创粉丝点击