KMP

#include <iostream>
#include <string.h>
using namespace std;
int Next[1110];
void get_Next(char *p){
    int m = strlen(p);
    Next[0] = Next[1] = 0;
    for (int i=1; i<m; ++i){
        int j=Next[i];
        while(j&&p[i]!=p[j]){
            j = Next[j];
        }
        Next[i+1] = p[i]==p[j]?j+1:0;
    }
}
int kmp (char *T, char *s){
    int n=strlen(T), m = strlen(s);
    get_Next(s);
    int j=0;
    for (int i=0; i<n; ++i){
        while(j && T[i]!=s[j]){
            j = Next[j];
        }
        if(s[j]==T[i]){
            ++j;
        }
        if(j==m){
            return i-m+1;
        }
    }
    return -1;
}
int main() {
    char s[1100], T[1100];
    cin >> T >> s;
    cout << kmp(T,s) << endl;
    return 0;
}

扩展KMP

#include <iostream>
#include <string.h>
using namespace std;

const int maxn = 1100;
int Next[maxn],extend[maxn];

void get_Next(char *s)
{
    int n = strlen(s);
    int i,j,k;
    for( j=0 ;1+j<n && s[j]==s[1+j];++j);
        Next[1] = j;
        k=1;
        for(i=2;i<n;++i)
        {
             int len = k + Next[k] , L = Next[i-k];
            if(L<len-i)
            {
                Next[i] = L;
            }else {
                for(j=max(0,len-i);i+j<n && s[j]==s[i+j];++j);
                    Next[i]=j;
                k=i;
            }
        }
    Next[0] = n;
}
void ex_kmp(char *T,char *s)
{
    int n = strlen(T),m = strlen(s);
    int i,j,k;
    for(j=0;j<n && j<m && T[j]==s[j];++j);
    extend[0]=j;
    k=0;
    for(i=1;i<n;++i)
    {
        int len = k+extend[k],L=Next[i-k];
        if(L<len-i)
        {
            extend[i] = L;
        }else
        {
            for(j=max(0,len-i);j<m && i+j<n && s[j]==T[i+j];++j);
            extend[i] = j;
            k = i;
        }
    }
}
int main() {
    char s[maxn],T[maxn];
    cin>>T>>s;
    get_Next(s);
    ex_kmp(T,s);
    for(int i=0;i<strlen(T);++i)
    {
        cout<<extend[i]<<" ";
    }
    cout<<endl;
    return 0;
}
Last modification:November 13th, 2019 at 08:55 pm
如果觉得我的文章对你有用,请随意赞赏