bzoj3942 - [USACO2015 Feb] Censoring

题目

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

猜你喜欢

转载自www.cnblogs.com/arg-53/p/9064740.html