字符串匹配-KMP算法

来源:互联网 发布:华罗庚知乎 编辑:程序博客网 时间:2024/06/05 10:27
#include<iostream>#include<string>#include<cstdio>#include<cstring>using namespace std;const int MAXL=1e6+10;char s[MAXL+50],t[MAXL+50];//s为目标串,t为模式串int Next[MAXL+50];void Getnext(){    int i=0,j=-1;    Next[0]=-1;    int len=strlen(t);    while(i<len-1)    {        if(j==-1||t[i]==t[j])        {            Next[++i]=++j;            if(t[i]==t[j])                Next[i]=Next[j];        }        else            j=Next[j];    }}int index_KMP(){    int i=0,j=0;    int len1=strlen(s),len2=strlen(t);    while(i<len1&&j<len2)    {        if(j==-1||s[i]==t[j])        {            i++;j++;        }        else        {            j=Next[j];        }    }    if(j>=len2)        return i-len2;    else        return -1;}int main(){    int i;    while(~scanf("%s",s))    {        scanf("%s",t);        memset(Next,0,sizeof(0));        Getnext();//求Next数组的值        int sub=index_KMP();//判断是否匹配        if(sub==-1)            cout<<"不匹配"<<endl;        else            cout<<sub<<endl;    }}