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; }