爆炸入口

有一个S串和一个T串,长度均小于1,000,000,设当前串为U串,然后从前往后枚举S串一个字符一个字符往U串里添加,若U串后缀为T,则去掉这个后缀继续流程。

这道题确乎是个很好的联系kmp的题目

结合了栈的思想。通过栈保留匹配时的失配指针的位置,达到分段删除的效果,即可以通过删去中间若干个T串,使得被删去左右两端可以拼成T。

同时也因为栈,使得我们在输出的更加方便。结束时,在栈中的元素一定是无法删除的元素。而且是有序的(输入顺序,从下标小的开始),直接输出即可以。


怎么使用栈呢?

对于每一个匹配串中的字符。我们一一将其入栈,然后保留以当前元素为结束kmp的失配指针,方便我们拼接。然后继续和普通的kmp一样匹配。

每次从栈顶拿一个元素出来(一定是栈),根据已经保留的失配指针继续匹配。

匹配到时,就立马退栈。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int manx=1000100;
int stack[manx],top;
int f[manx],fail[manx];
char a[manx],b[manx];
int main()
{
int n,m;
scanf("%s%s",a,b);
n=strlen(a),m=strlen(b);
int k=0;
for(int i=1;i<m;i++)
{
while(k&&b[i]!=b[k]) k=fail[k];
if(b[i]==b[k]) fail[i+1]=++k;//处理失配指针
}
for(int i=0;i<n;i++)//一样的匹配
{
k=f[stack[top]];//每次从栈顶拿一个元素,因为第一个元素是0,所以说我就没有写将0入栈
while(k&&a[i]!=b[k]) k=fail[k];//跳失配
if(a[i]==b[k]) ++k;
if(k==m) top-=(m-1);//匹配到时,退栈,一定要处理好退栈的元素个数,我这里i还没有入栈,所以只退栈m-1个元素
else f[i]=k,stack[++top]=i;//保留fail,进栈
}
for(int i=1;i<=top;i++)
printf("%c",a[stack[i]]);//输出
}

B3942 Censoring的更多相关文章

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

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

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

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

  3. [Usaco2015 Feb]Censoring(bzoj 3942)

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

  4. bzoj3940: [Usaco2015 Feb]Censoring

    AC自动机.为什么洛谷水题赛会出现这种题然而并不会那么题意就不说啦 .终于会写AC自动机判断是否是子串啦...用到kmp的就可以用AC自动机水过去啦 #include<cstdio> #i ...

  5. 【USACO15FEB】审查(黄金)Censoring (Gold)

    题目描述 Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so they h ...

  6. BZOJ 3940--[Usaco2015 Feb]Censoring(AC自动机)

    3940: [Usaco2015 Feb]Censoring Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 723  Solved: 360[Subm ...

  7. P4824 [USACO15FEB]Censoring (Silver) 审查(银)&&P3121 [USACO15FEB]审查(黄金)Censoring (Gold)

    P3121 [USACO15FEB]审查(黄金)Censoring (Gold) (银的正解是KMP) AC自动机+栈 多字符串匹配--->AC自动机 删除单词的特性--->栈 所以我们先 ...

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

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

  9. 3942: [Usaco2015 Feb]Censoring

    3942: [Usaco2015 Feb]Censoring Time Limit: 10 Sec Memory Limit: 128 MB Submit: 964 Solved: 480 [Subm ...

随机推荐

  1. QQ号_保存_20180124

    1.1337978907 (密码:33+我的名字全小写全部拼音) 2. 3. 4. 5.

  2. vue中methods函数调用methods函数写法

    export default { data() { return { hello:"你好" } }, methods:{ open(that) { that.hello = &qu ...

  3. 使用PyCharm实现远程编写并调试代码

    使用PyCharm实现远程编写并调试代码 版权声明:本文为博主原创文章,转载请注明出https://www.cnblogs.com/wenqiangit/p/9771947.html 因为工作中使用的 ...

  4. Android中当前Activity跳转到当前Activity页面

    步骤:先关闭自己,在跳转 case R.id.btn_copy:// 复制 Toast.makeText(mContext, "正在复制", Toast.LENGTH_SHORT) ...

  5. 性能测试工具LoadRunner20-LR之Controller Service-Level Agreement(服务水平协议)

    SLA是为负载测试场景定义的具体目标.例如,评测脚本中任意数量事务的平均响应时间,可以定义具体的目标或阈值.测试运行结束之后,LR将你定义的目标与实际录制的平均事务响应时间进行比较.如果实际的平均事务 ...

  6. git分布式的理解----简单服务端搭建

    Git是分布式的,并没有服务端跟客户端之分,所谓的服务端安装的其实也是git.Git支持四种协议,file,ssh,git,http.ssh是使用较多的,下面使用ssh搭建一个免密码登录的服务端. 1 ...

  7. C/C++中 static 的作用

    在C中,有三个作用: 1.修饰全局变量: 作用是隐藏,也就是这个全局变量仅在本文件中可见. 2.修饰局部变量: 作用是扩展变量的生存期,令这个局部变量成为静态的. 3.修饰函数: 作用是隐藏,将此函数 ...

  8. 60、Docker 学习笔记(CentOS 7.1)

    #基本概念 -x86_64-minimal.tar.gz | docker import - centos:v7.mini``` 然后查看导入的镜像: ##上传镜像 >用户可以通过 docker ...

  9. 你会用setTimeout吗

    定义很简单 setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式. 广泛应用场景 定时器,轮播图,动画效果,自动滚动等等 上面一些应该是setTimeout在大家心中的样子,因为我们 ...

  10. VMWare 9 安装 win8

    http://tieba.baidu.com/p/1954912175 http://down.51cto.com/data/497803 win8专业版:NBCCB-JJJDX-PKBKJ-KQX8 ...