23次理解了,一个讲的不错的博客:https://blog.csdn.net/starstar1992/article/details/54913261#commentBox

char str[MAXN],s[MAXN];
int next[MAXN];
void get_next(char *s)
{
    int len=strlen(s),k=-1;
    next[0]=-1;
    for(int i=1;i<len;++i)
    {
        while(k>-1&&s[k+1]!=s[i])k=next[k];
        if(s[k+1]==s[i])k++;
        next[i]=k;
    }
}
int kmp(char *str,char *s)
{
    get_next(s);
    int k=-1,len_s=strlen(s),len_str=strlen(str);
    for(int i=0;i<len_str;++i)
    {
        while(k>-1&&s[k+1]!=str[i])k=next[k];
        if(s[k+1]==str[i])k++;
        if(k==len_s-1)return i-len_s+1;
    }
    return -1;
}
int main()
{
    //ios::sync_with_stdio(false);
    while(cin>>str>>s)
    cout<<kmp(str,s)<<endl;
    return 0;
}

 

posted on 2019-08-11 09:42  megadeth  阅读(106)  评论(0编辑  收藏  举报