题目
https://www.lydsy.com/JudgeOnline/problem.php?id=3942
题解
partial match 在 kmp 里是从上一个位置匹配过来,这里开个栈,发现完全匹配敏感词了就把敏感词给弹出,下次把 partial match 数从栈顶继承过来。
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (n); ++i)
char S[1000010];
char T[1000010];
int fail[1000010];
int cnt[1000010];
int stac[1000010]; // id
int main() {
scanf("%s %s", S, T);
int N = strlen(S), M = strlen(T);
fail[0] = -1;
for (int i = 1, j = -1; i < M; ++i) {
while (j != -1 && T[i] != T[j + 1]) j = fail[j];
if (T[i] == T[j + 1]) ++j;
fail[i] = j;
}
int head = 0;
for (int i = 0; i < N; ++i) {
stac[head++] = i;
int j = head <= 1 ? -1 : cnt[stac[head - 2]];
while (j != -1 && S[i] != T[j + 1]) j = fail[j];
if (S[i] == T[j + 1]) ++j;
cnt[stac[head - 1]] = j;
if (j == M - 1) {
head -= M;
j = fail[j];
}
}
for (int i = 0; i < head; ++i) putchar(S[stac[i]]);
putchar('\n');
}