题面

就是让你——在字符串A中,如果字符串B是A的子串,那么就删除在A中第一个出现的B,然后拼接在一起,一直重复上述步骤直到B不再是A的子串

|A|\(\le 10^6\)


思路:

KMP+栈

1、由于是两个字符串匹配的问题,当然一下子就会想到KMP

2、由于是删去一段区间,很多人第一反应会想到链表,但是在这里,其实删除了一段后,对之前没有影响的,并且,一定是从后往前删除,所以,更优的存储结构应该是

3、有人会问,为什么删去对前面没有影响,这就根据KMP的原理,做到i这个位置的结果就是最优的,我们只需要用f数组记录一下KMP匹配的结果(f[i]表示以i结尾最大能匹配多长的字符串)。

如何进行?

1、KMP板子跑一遍

2、在KMP过程中,把遍历到的i(不是字符,而是下标)入栈,当匹配到一个完整的串时,把这一整串出栈,然后j从栈顶的i所能匹配到的最大的位置开始(就是f[i]记录的值),继续做KMP

时间复杂度:B自身匹配一次+A与B匹配一次+A中最多每个字符进出栈一次,这么说来时间复杂度还是线性


于是,代码就很好构造了

Code:

#include<bits/stdc++.h>
#define N 1000010
using namespace std;
int la,lb,res;
char a[N],b[N];
int p[N],f[N];//分别表示B串自身匹配的结果、A串与B串匹配的结果
int St[N],top;//模拟栈,STL的栈也是可以的,就是比较低效
int main()
{
int i,j;
scanf("%s",a+1);
scanf("%s",b+1);
la=strlen(a+1);
lb=strlen(b+1);
for(i=2,j=0;i<=lb;i++)//自身匹配
{
while(j&&b[i]!=b[j+1])
j=p[j];
if(b[i]==b[j+1])
j++;
p[i]=j;
}
for(i=1,j=0;i<=la;i++)//A与B匹配
{
while(j&&a[i]!=b[j+1])
j=p[j];
if(a[i]==b[j+1])
j++;
f[i]=j;//记录结果
St[++top]=i;//入栈
if(j==lb)//如果匹配成功
{
res=lb;
while(res)//出栈,res记录应该出多少字符
res--,top--;
j=f[St[top]];//更新j值
}
}
for(i=1;i<=top;i++)//大功率输出
printf("%c",a[St[i]]);
return 0;
}

推荐题目:

Luogu P3121 [USACO15FEB]审查(黄金)Censoring (Gold) 似乎这俩是一对?!

「USACO15FEB」Censoring (Silver) 审查(银) 解题报告的更多相关文章

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

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

  2. 「NOI2013」小 Q 的修炼 解题报告

    「NOI2013」小 Q 的修炼 第一次完整的做出一个提答,花了半个晚上+一个上午+半个下午 总体来说太慢了 对于此题,我认为的难点是观察数据并猜测性质和读入操作 我隔一会就思考这个sb字符串读起来怎 ...

  3. 「SDOI2017」树点涂色 解题报告

    「SDOI2017」树点涂色 我sb的不行了 其实一开始有一个类似动态dp的想法 每个点维护到lct树上到最浅点的颜色段数,然后维护一个\(mx_{0,1}\)也就是是否用虚儿子的最大颜色 用个set ...

  4. 「SCOI2015」小凸想跑步 解题报告

    「SCOI2015」小凸想跑步 最开始以为和多边形的重心有关,后来发现多边形的重心没啥好玩的性质 实际上你把面积小于的不等式列出来,发现是一次的,那么就可以半平面交了 Code: #include & ...

  5. 「SCOI2015」小凸解密码 解题报告

    「SCOI2015」小凸解密码 题意:给一个环,定义一段连续的极长\(0\)串为\(0\)区间,定义一个位置的离一个\(0\)区间的距离为这个位置离这个区间中\(0\)的距离的最小值,每次询问一个位置 ...

  6. 「SCOI2015」小凸玩矩阵 解题报告

    「SCOI2015」小凸玩矩阵 我好沙茶啊 把点当边连接行和列,在外面二分答案跑图的匹配就行了 我最开始二分方向搞反了,样例没过. 脑袋一抽,这绝壁要费用流,连忙打了个KM 然后wa了,一想这个不是完 ...

  7. 「SCOI2015」小凸玩密室 解题报告

    「SCOI2015」小凸玩密室 虽然有心里在想一些奇奇怪怪的事情的原因,不过还是写太久了.. 不过这个题本身也挺厉害的 注意第一个被点亮的是任意选的,我最开始压根没注意到 \(dp_{i,j}\)代表 ...

  8. 「SCOI2014」方伯伯运椰子 解题报告

    「SCOI2014」方伯伯运椰子 可以看出是分数规划 然后我们可以看出其实只需要改变1的流量就可以了,因为每次改变要保证流量守恒,必须流成一个环,在正负性确定的情况下,变几次是无所谓的. 然后按照套路 ...

  9. 「SCOI2014」方伯伯的 OJ 解题报告

    「SCOI2014」方伯伯的 OJ 和列队有点像,平衡树点分裂维护即可 但是需要额外用个set之类的对编号查找点的位置 插入完了后记得splay,删除时注意特判好多东西 Code: #include ...

随机推荐

  1. cmd导入比较大的sql脚本

    osql -S jack_c -d yourdb -U sa -P 123 -i E:\user.sql 注意: sql脚本里面一定要先创建数据库或者use到某个数据库,然后再cmd执行脚本

  2. H3C 星型以太网拓扑扩展

  3. supersockets服务器配置热更新

    Keywords: 配置,热更新 此功能能够允许你在不重启服务器的前提下更新服务器实例的配置. (仅限1.6.5及其以上版本)

  4. Python--day63--图书管理系统表结构设计

    pycharm中运行manage.py的工具: 1,将变更翻译成SQL语句,去数据库中执行(ORM操作过数据库后都要执行这两条命令) 2,ForeignKey会自动在属性后面加_id 3,ORM封装p ...

  5. Python--day47--内容回顾

    1.什么是数据库

  6. [转]分布式session的几种实现方式

    我们应当对产生的Session进行处理,通过粘性Session,Session复制或Session共享等方式保证用户的体验度. 以下我将说明5种Session处理策略,并分析其优劣性. 第一种:粘性s ...

  7. Vue 组件中的data数据

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Python--day60--一个简单(不完整)的web框架

  9. 扶桑号战列舰 (单调栈+线段树区间更新懒惰标记 or 栈)

    传送门 •题目描述 题目描述 众所周知,一战过后,在世界列强建造超无畏级战列舰的竞争之中,旧日本海军根据“个舰优越主义”,建造了扶桑级战列舰,完工时为当时世界上武装最为强大的舰只. 同时,扶桑号战列舰 ...

  10. java 注解(Annotation)

    注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记. 以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就 ...