$KMP$问题的核心在于数组$next$(或者$pre$/$fail$,各种叫法),几乎所有的此类型题都是需要计算$next$的。

这里解释一波$next$:即满足字符子串$s[1...k]=s[j-k+1...j]$的最大$k$。比如说:

字符串$abaca$的$next[5]$就是$1$,因为只有$s[1]=s[5]$。

而字符串$abcab$的$next[5]$就是2,同理,$s[1...2]=s[4...5]$。

弄清楚了这一点,来看题目,显然,这道题的难点在于删除字符后有可能对前面已经匹配完了的字符产生新一次的匹配,因为后面新加入的字符可能对前面的字符有贡献。

既然这样,我们不妨设一下四个变量:$i,j,k,l$(所有字符串从$0$开始)。

其中$i,l$表示当前需要将$S_i$加入到$U_l$中,$j$表示当前匹配到了$T_j$,$k$表示当前已经匹配到$U_k$。

  • 如果当$k==l$时,代表前$k-1$个字符已经匹配完,添加新字符。
  • 接下来就是调整$next$和判断是否匹配,同普通$KMP$算法 。
  • !!重点:当$j==lenT$即已经匹配完了,则将$j$归零,将$l$减去$lenT$示删去了$lenT$个字符,因为$l$就是新串的长度,接下来,我们直接将$k$减去$lenT\times 2$因为前面最多会有$lenT-1$个字符与$T$匹配,特判一下当$k<0$时将$k$置为$0$就可以了。

#include <cstdio>
#include <cstring> const int Len = 1e6 + 10;
char S[Len], T[Len], U[Len];
int lenS, lenT, nxt[Len]; void init () {
for (int i = 1, j = 0; i < lenT; ++i) {
while (j && T[i] != T[j]) j = nxt[j];
j += (T[i] == T[j]), nxt[i + 1] = j;
}
} int main () {
scanf ("%s%s", S, T);
lenS = strlen (S), lenT = strlen(T);
init ();
int l = 0, k = 0, i = 0, j = 0;
while (i < lenS) {
if (k == l) U[l++] = S[i++];
while (j && U[k] != T[j]) j = nxt[j];
j += (U[k] == T[j]);
if (j == lenT) {
j = 0, l -= lenT;
k -= lenT << 1;
}
if (k < 0) k = 0;
else ++k;
}
for (int i = 0; i < l; ++i)
putchar (U[i]);
return 0;
}

Bzoj3942 Censoring(KMP)的更多相关文章

  1. 【BZOJ3942】Censoring [KMP]

    Censoring Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 有一个S串和一个T串,长 ...

  2. Bzoj 3942: [Usaco2015 Feb]Censoring(kmp)

    3942: [Usaco2015 Feb]Censoring Description Farmer John has purchased a subscription to Good Hooveske ...

  3. 3942: [Usaco2015 Feb]Censoring [KMP]

    3942: [Usaco2015 Feb]Censoring Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 375  Solved: 206[Subm ...

  4. LG4824 「USACO2015FEB」(Silver)Censoring KMP+栈

    问题描述 LG4824 题解 大概需要回顾(看了题解) KMP 先对要删除的 模式串 进行自我匹配,求出 \(\mathrm{fail}\) 然后再扫 文本串 的过程中记录一下每个字符匹配的最大长度, ...

  5. 【Trie图】BZOJ3940-[Usaco2015 Feb]Censoring

    [题目大意] 有一个匹配串和多个模式串,现在不断删去匹配串中的模式串,求出最后匹配串剩下的部分. [思路] 众所周知,KMP的题往往对应着一道AC自动机quq.本题同BZOJ3942(KMP),这里改 ...

  6. 【BZOJ3940】【BZOJ3942】[Usaco2015 Feb]Censoring AC自动机/KMP/hash+栈

    [BZOJ3942][Usaco2015 Feb]Censoring Description Farmer John has purchased a subscription to Good Hoov ...

  7. BZOJ3942: [Usaco2015 Feb]Censoring 栈+KMP

    Description Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so ...

  8. 【KMP】Censoring

    [KMP]Censoring 题目描述 Farmer John has purchased a subscription to Good Hooveskeeping magazine for his ...

  9. Censoring(栈+KMP)

    # 10048. 「一本通 2.2 练习 4」Censoring [题目描述] 给出两个字符串 $S$ 和 $T$,每次从前往后找到 $S$ 的一个子串 $A=T$ 并将其删除,空缺位依次向前补齐,重 ...

随机推荐

  1. 51Nod 1004 n^n末尾数字 | 快速幂

    #include "bits/stdc++.h" using namespace std; #define LL long long #define INF 0x3f3f3f3f3 ...

  2. NDK---使用,开发步骤

    使用NDk的场景: 1.某些方法,是使用C,C++本地代码实现的,然后,我想在Java中调用这些方法.这个时候,就需要使用到JNI技术. 应用NDK的时候,分两个部分,Java部分,JNI层部分,本地 ...

  3. Android Studio键盘快捷键

    Android Studio 为许多常用操作提供了键盘快捷键. 表 1 按操作系统显示了默认键盘快捷键. 注:除了下面表 1 中的默认键映射外,您还可以选择多种预设的键映射,也可以创建自定义键映射.如 ...

  4. 炒鸡简单的canvas粒子(山东数漫江湖)

    位图的canvas一直不会被svg比下去的原因了. 俗话说,须弥芥子,是大小之说,也有以小见大之说,颗颗粒子,足以构建宏大效果. 这是一篇炒鸡简单的canvas粒子教程,主要是讲如何粒子特效的原理,一 ...

  5. 重写strstr、strcpy、memcpy、memset、atof算法

    #include<stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> ...

  6. 转一篇sublime必备的一些插件

    Package Control 功能:安装包管理 简介:sublime插件控制台,提供添加.删除.禁用.查找插件等功能 使用:https://sublime.wbond.net/installatio ...

  7. ASP.NET MVC各个版本区别

    ASP.NET MVC 1 view接收用户输入,把命令传到controller controller处理命令,更新model model被更新后,会通知view需要update view更新后向用户 ...

  8. kernel defconfig

    Some defconfig files are placed on below path. Only one *_defconfig can be selected. android/kernel/ ...

  9. unbutu下Io language的解释器安装

    今晚看Io,然后要安装解释器,然后就记录下来了... 首先去官网下载 http://iolanguage.com 在页面下方的binaries那里找到自己系统对应的版本,我的是x64deb的,本来是下 ...

  10. 【LabVIEW技巧】工厂模式_简单工厂

    前言 上一个文章介绍了如何学习LabVIEW OOP,简要的提及了一些OOP学习中注意的事项,许多文章的读者反映写的太范,后文会逐步缩小范围,讨论在LabVIEW中各个模式的应用. 工厂模式概述 工厂 ...