【模板】KMP字符串匹配

P3375 【模板】KMP字符串匹配

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N =1e6 + 10;
char s[N], p[N];
int ne[N];

int main()
{
    cin >> s >> p;
    int n = (int)strlen(p), m = (int)strlen(s);
    for(int i = n; i >= 1; i --) p[i] = p[i - 1];
    for(int i = m; i >= 1; i --) s[i] = s[i - 1];
    for(int i = 2, j = 0; i <= n; i ++)
    {
        while(j && p[i] != p[j + 1]) j = ne[j];
        if(p[i] == p[j + 1]) j ++;
        ne[i] = j;
    }

    for(int i = 0, j = 0; i <= m; i ++)
    {
        while(j && s[i] != p[j + 1]) j = ne[j];
        if(s[i] == p[j + 1]) j ++;
        if(j == n)
        {
            cout << i - n + 1 << endl;
            j = ne[j];
        }
    }

    for(int i = 1; i <= n; i ++)
    {
        cout << ne[i] << " ";
    }
    cout << endl;

    return 0;
}

老大难,KMP问题。

 
原文地址:https://www.cnblogs.com/longxue1991/p/13084923.html