Bzoj3942 Censoring(KMP)
$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)的更多相关文章
- 【BZOJ3942】Censoring [KMP]
Censoring Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 有一个S串和一个T串,长 ...
- Bzoj 3942: [Usaco2015 Feb]Censoring(kmp)
3942: [Usaco2015 Feb]Censoring Description Farmer John has purchased a subscription to Good Hooveske ...
- 3942: [Usaco2015 Feb]Censoring [KMP]
3942: [Usaco2015 Feb]Censoring Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 375 Solved: 206[Subm ...
- LG4824 「USACO2015FEB」(Silver)Censoring KMP+栈
问题描述 LG4824 题解 大概需要回顾(看了题解) KMP 先对要删除的 模式串 进行自我匹配,求出 \(\mathrm{fail}\) 然后再扫 文本串 的过程中记录一下每个字符匹配的最大长度, ...
- 【Trie图】BZOJ3940-[Usaco2015 Feb]Censoring
[题目大意] 有一个匹配串和多个模式串,现在不断删去匹配串中的模式串,求出最后匹配串剩下的部分. [思路] 众所周知,KMP的题往往对应着一道AC自动机quq.本题同BZOJ3942(KMP),这里改 ...
- 【BZOJ3940】【BZOJ3942】[Usaco2015 Feb]Censoring AC自动机/KMP/hash+栈
[BZOJ3942][Usaco2015 Feb]Censoring Description Farmer John has purchased a subscription to Good Hoov ...
- BZOJ3942: [Usaco2015 Feb]Censoring 栈+KMP
Description Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so ...
- 【KMP】Censoring
[KMP]Censoring 题目描述 Farmer John has purchased a subscription to Good Hooveskeeping magazine for his ...
- Censoring(栈+KMP)
# 10048. 「一本通 2.2 练习 4」Censoring [题目描述] 给出两个字符串 $S$ 和 $T$,每次从前往后找到 $S$ 的一个子串 $A=T$ 并将其删除,空缺位依次向前补齐,重 ...
随机推荐
- 51nod 1766 树上的最远点对——线段树
n个点被n-1条边连接成了一颗树,给出a~b和c~d两个区间,表示点的标号请你求出两个区间内各选一点之间的最大距离,即你需要求出max{dis(i,j) |a<=i<=b,c<=j& ...
- 【BZOJ】1609: [Usaco2008 Feb]Eating Together麻烦的聚餐
[算法]动态规划 [题解]DP有个特点(递推的特点),就是记录所有可能状态然后按顺序转移. 最优化问题中DP往往占据重要地位. f[i][j]表示前i头奶牛,第i头改为号码j的最小改动数字,这样每头奶 ...
- lua 闪电特效
闪电特效 根据不同的起点 终点 资源做倾斜 拉伸 ,主要是计算倾斜角度. function ZyLight:show(params) local params = params or {} local ...
- 盲注脚本2.基于bool
盲注脚本2.基于bool #!/usr/bin/env python #encoding:utf-8 #by i3ekr #using # python sqlinject.py -D "数 ...
- gcc中的内嵌汇编语言(Intel i386平台)
[转]http://bbs.chinaunix.net/thread-2149855-1-1.html 一.声明 虽然Linux的核心代码大部分是用C语言编写的,但是不可避免的其中还是有一部分是用汇 ...
- sk_buff结构
sk_buff结构用来描述已接收或者待发送的数据报文信息:skb在不同网络协议层之间传递,可被用于不同网络协议,如二层的mac或其他链路层协议,三层的ip,四层的tcp或者udp协议,其中某些成员变量 ...
- python基础===字符串的制表,换行基础操作
\n\t 制表符和换行符 >>> print("Languages:\n\tPython\n\tC\n\tJavaScript") Languages: Pyth ...
- echarts3.0版本断点连线的处理
项目应用到echarts图表组件.官网的demo中出现空数据会断开.经过跟踪调试.修改echarts.js以下代码即可实现断点连线功能(需要将空数据处理成'-'.这样才能均值): for (var ...
- 分割线用CSS样式做出来的效果
一:单个标签实现分隔线:. ; ; line-height: 1px; border-left: 200px solid #ddd; border-right: 200px solid #ddd; t ...
- 虚拟机 VMware Workstation12 安装OS X 系统
Windows下虚拟机安装Mac OS X —– VMware Workstation12安装Mac OS X 10.11 本文即将介绍WIN虚拟MAC的教程.完整详细教程(包含安装中的一些问题) ...