kmpの実装-単純なアルゴリズム

#include <iostream>
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>

using namespace std;

const int inf = 0x3f3f3f3f;
const int maxn = 2005;
#define eps 1e-8
#define INIT(x) memset(x,0,sizeof(x))
typedef long long ll;

string s2,s1;
int nxt[maxn];

void get_next(string s)
{
    
    
    nxt[0] = -1;
    nxt[1] = 0;
    int cn = 0;
    int i = 2;
    while(i<s.length())
    {
    
    
        if(s[i-1]==s[cn])
            nxt[i++] = ++cn;
        else if(cn>0)
            cn = nxt[cn];
        else
            nxt[i++] = 0;
    }
}

int kmp()
{
    
    
    INIT(nxt);
    int ans = 0;
    get_next(s2);
    int i=0,j=0;
    while(i<s1.length()&&j<s2.length())
    {
    
    
        if(s1[i]==s2[j]) {
    
    
            i++,j++;
        }else if(nxt[j]==-1) {
    
    
            i++;
            j=0;
        }else {
    
    
            j = nxt[j];
        }
        if(j==s2.length()) {
    
    
            ans++;
            j = 0;
        }
    }
    return ans;
}

int main()
{
    
    
    while(cin>>s1)
    {
    
    
        if(s1=="#") break;
        cin>>s2;
        int ans = kmp();
        cout<<ans<<endl;
    }
    return 0;
}

おすすめ

転載: blog.csdn.net/qq_41563270/article/details/108362614
おすすめ