831. KMP字符串

#include <bits/stdc++.h>
using namespace std;

const int N = 100010, M = 1000010;
int ne[N];
char s[M], p[N];
int n, m;

int main() {
    cin >> n >> p + 1 >> m >> s + 1;
    //  ababadsdsab  ne[4] = 2 前缀ab后缀ab  ne[5] = 3 前缀aba后缀aba
    // ne[i]数组表示字符串p选取长度为前i个的子串时的最长公共前后缀 前后缀不能为子串本身
    // 所以长度为1时ne[1] = 0; 下面循环i从2开始
    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;
    }
    cout << ne[5] << endl;
    for(int i = 1, 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 - j << " ";
            j = ne[j];
        }
    }
    return 0;
}

 

posted @ 2020-09-03 11:42  Sexyomaru  阅读(182)  评论(0编辑  收藏  举报