hihocoder 1015 KMP算法

似乎上上星期就准备学kmp了。。。 发现next怎么来的一脸懵逼。。
而且网上似乎有些东西,写的很复杂,有些东西现在感觉上又问题。。
昨天下午在看了别人的两篇博客后,在结合自己的理解终于懵懂了。。

这是例题。。

kmp的难度感觉只是在next 这个东西的产生,但是只要充分理解前缀,后缀,就不怎么难了,而且,这东西好巧妙,next里面的东西就当做的第几号模式好了,这样就可以简单的理解为模式转化。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
using namespace std;
string a,b;
int nexts[100010];
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        a.clear();
        b.clear();
        cin>>a>>b;
        int lena=a.size();
        int lenb=b.size();
        nexts[0]=-1;
        int i=0;
        int j=nexts[0];
        while(i<lena)//build nexts;
        {
            if(j==-1||a[i]==a[j])
            {
                i++;
                j++;
                nexts[i]=j;
            }
            else
            {
                j=nexts[j];
            }
        }
        i=0;
        j=0;
        int ans=0;
        while(i<lenb)
        {
            if(j==-1||a[j]==b[i])
            {
                i++;
                j++;
            }
            else
            {
                j=nexts[j];
            }
            if(j==lena)
            {
                ans++;
            }
        }
        cout<<ans<<endl;
    }

    return 0;
}

你可能感兴趣的:(KMP,hihoCoder)