题面

Description

农夫约翰为他的奶牛们购买了一份名字叫Good Hooveskeeping的定期杂志,因此奶牛们在挤奶期间就有了大量的阅读素材。遗憾的是在最新的一期上,有一篇有点儿不适当的文章,是关于如何烹饪完美的牛排。

FJ不想让她们看到那篇文章,(显然,这份杂志需要更好的编辑监督)。

FJ已经采集了杂志的所有文本,并将其创建成了一个长度最多10^6个字符的字符串。他有一个审查出来的想要从这个字符串中删除的发生不适当内容的一组子串t1 ...tN。这样,农民约翰会找到串S中最早出现的一个被审查出来的词(在最开始给的单词序列里)并从串S中删除它,他接着再重复这个过程,继续在串S中删除当前最早出现的审查出来的单词。重复这个过程,直到S中没有被审查出来单词出现。注意:每次删除操作发生后可能创建出一个在以前串S中是不存在的新的(单词列表中有的)单词。

农民约翰注意到,审查出来的一个待删词不会作为另一个待删词的子串出现。特别的这意味着串S中最早出现的待删词是唯一的。

请帮助FJ确定最终的审查内容

Input

第一行包含S.

第二行包含N,即审查出来的单词的数量。

接下来的N行包含字符串t1…tn。每个字符串将只包含小写字母(范围在a...z),并且所有这些字符串的组合长度将最多是10^5。

Output

删除操作完成后形成的新的字符串S(这里保证删除过程中不会出现空串)。

Sample Input

begintheescapexecutionatthebreakofdawn

2

escape

execution

Sample Output

beginthatthebreakofdawn

题解

看到要对字符串进行多串的匹配

很容易想到\(AC\)自动机

那么,如何解决删完一个串之后继续删下一个串呢。

考虑用一个栈压一下每次匹配到的AC自动机上的节点位置

如果要退回,显然就是把栈顶的若干个匹配完的元素弹出,继续用栈顶匹配即可。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
struct Node
{
int vis[26];
char val;
int tot,fail;
}t[120000];
char ss[100000];
char c[100000];
char SS[120000];
int n,S[120000],top=0,tot;
void Insert(char *s)
{
int l=strlen(s),now=0;
for(int i=0;i<l;++i)
{
if(!t[now].vis[s[i]-'a'])
t[now].vis[s[i]-'a']=++tot;
now=t[now].vis[s[i]-'a'];
}
t[now].tot=l;
}
void BuildF()
{
queue<int> Q;
for(int i=0;i<26;++i)
if(t[0].vis[i])
Q.push(t[0].vis[i]);
while(!Q.empty())
{
int u=Q.front();Q.pop();
for(int i=0;i<26;++i)
{
if(t[u].vis[i])
t[t[u].vis[i]].fail=t[t[u].fail].vis[i],Q.push(t[u].vis[i]);
else
t[u].vis[i]=t[t[u].fail].vis[i];
}
}
}
int main()
{
scanf("%s",ss);
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%s",c);
Insert(c);
}
BuildF();
int now=0;
for(int i=0,L=strlen(ss);i<L;++i)
{
++top;
S[top]=now;
SS[top]=ss[i];
now=t[now].vis[ss[i]-'a'];
if(t[now].tot)
top-=t[now].tot,now=S[top+1];
}
for(int i=1;i<=top;++i)
printf("%c",SS[i]);
return 0;
}

【Luogu3121】审查(AC自动机)的更多相关文章

  1. P3121 [USACO15FEB]审查(AC自动机)

    题目: P3121 [USACO15FEB]审查(黄金)Censoring (Gold) 解析: 多字符串匹配,首先想到AC自动机 建立一个AC自动机 因为有删除和拼接这种操作,考虑用栈维护 顺着文本 ...

  2. 洛谷.3121.审查(AC自动机 链表)

    题目链接 //删掉一个单词需要前移一段位置,用链表维护就好了 复杂度O(sum(len)) #include <cstdio> #include <cstring> #defi ...

  3. [洛谷P3121] 审查(黄金) (AC自动机)

    题目描述 FJ把杂志上所有的文章摘抄了下来并把它变成了一个长度不超过10^5的字符串S.他有一个包含n个单词的列表,列表里的n个单词记为t_1...t_N.他希望从S中删除这些单词. FJ每次在S中找 ...

  4. 洛谷P3121 审查(黄金)Censoring(Gold) [USACO15FEB] AC自动机

    正解:AC自动机 解题报告: 传送门! 啊我好呆啊其实就挺模板题的,,,只是要一个栈搞一下,,,然后我就不会了,,,是看了题解才get的,,,QAQ 然后写下解法趴QwQ 首先看到多串匹配不难想到AC ...

  5. 洛谷 P3121 [USACO15FEB]审查(黄金)Censoring (Gold) 【AC自动机+栈】

    这个和bzoj同名题不一样,有多个匹配串 但是思路是一样的,写个AC自动机,同样是开两个栈,一个存字符,一个存当前点在trie树上的位置,然后如果到了某个匹配串的末尾,则弹栈 #include< ...

  6. AC自动机题单

    AC自动机题目 真的超级感谢xzy 真的帮到我很多 题单 [X] [luogu3808][模板]AC自动机(简单版) https://www.luogu.org/problemnew/show/P38 ...

  7. BZOJ2938[Poi2000]病毒——AC自动机

    题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...

  8. [POI2000]病毒 --- AC自动机

    [POI2000]病毒 题目描述: 二进制病毒审查委员会最近发现了如下的规律: 某些确定的二进制串是病毒的代码. 如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的. 现在委员会已经找 ...

  9. 【BZOJ2938】[Poi2000]病毒 AC自动机+DFS

    [BZOJ2938][Poi2000]病毒 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码 ...

随机推荐

  1. LeetCode - 626. Exchange Seats

    Mary is a teacher in a middle school and she has a table seat storing students' names and their corr ...

  2. cisco模拟器GNS3和虚拟机VMware的整合

    微软和思科环境: 在思科认证的学习中,我们需要用到许多类的模拟器,但这些模拟器并不能够更真实的模拟我们的用户机在应用中所出现的现象.因此,我们借由微软的环境来更真实地体现我们所搭建的网络中的一些应用. ...

  3. 基于MATLAB2016b图形化设计自动生成Verilog语言的积分模块及其应用

    在电力电子变流器设备中,常常需要计算发电量,由于电力电子变流器设备一般是高频变流设备,所以发电量的计算几乎时实时功率的积分,此时就会用到一个积分模块.发电量计算的公式如下:Q=∫P. FPGA由于其并 ...

  4. Spring Boot 注解详解

    一.注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan.@Configuration和@EnableAutoConfiguration ...

  5. Shiro笔记--shiroFilter权限过滤

    1.shiro中shiroFilter中的一些配置页面的过滤权限 <!--名字必须和web.xml里面的filter-name一样--> <bean id="shiroFi ...

  6. 创建Maven web工程不能解析EL表达式的解决办法

    在web.xml中讲头部改为: <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee&qu ...

  7. Duilib第一步(III)-知识进阶

    核心模块 CWindowWnd:窗口对象管理父类 创建窗口. 窗口消息过程处理. 提供窗口子类化.超类化接口. CDialogBuilder:空间布局类 解析XML界面布局文件,构建控件树 创建控件对 ...

  8. string (KMP+期望DP)

    Time Limit: 1000 ms   Memory Limit: 256 MB Description  给定一个由且仅由字符 'H' , 'T' 构成的字符串$S$. 给定一个最初为空的字符串 ...

  9. Redis笔记5-redis高可用方案

    一.哨兵机制 有了主从复制的实现以后,如果想对主服务器进行监控,那么在redis2.6以后提供了一个"哨兵"的机制.顾名思义,哨兵的含义就是监控redis系统的运行状态.可以启动多 ...

  10. Spark SQL1.2测试

    Spark SQL 1.2 运行原理 case class方式 json文件方式 背景:了解到HDP也能够支持Spark SQL,但官方文档是版本1.2,希望支持传统数据库.hadoop平台.文本格式 ...