【Luogu3121】审查(AC自动机)
题面
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自动机)的更多相关文章
- P3121 [USACO15FEB]审查(AC自动机)
题目: P3121 [USACO15FEB]审查(黄金)Censoring (Gold) 解析: 多字符串匹配,首先想到AC自动机 建立一个AC自动机 因为有删除和拼接这种操作,考虑用栈维护 顺着文本 ...
- 洛谷.3121.审查(AC自动机 链表)
题目链接 //删掉一个单词需要前移一段位置,用链表维护就好了 复杂度O(sum(len)) #include <cstdio> #include <cstring> #defi ...
- [洛谷P3121] 审查(黄金) (AC自动机)
题目描述 FJ把杂志上所有的文章摘抄了下来并把它变成了一个长度不超过10^5的字符串S.他有一个包含n个单词的列表,列表里的n个单词记为t_1...t_N.他希望从S中删除这些单词. FJ每次在S中找 ...
- 洛谷P3121 审查(黄金)Censoring(Gold) [USACO15FEB] AC自动机
正解:AC自动机 解题报告: 传送门! 啊我好呆啊其实就挺模板题的,,,只是要一个栈搞一下,,,然后我就不会了,,,是看了题解才get的,,,QAQ 然后写下解法趴QwQ 首先看到多串匹配不难想到AC ...
- 洛谷 P3121 [USACO15FEB]审查(黄金)Censoring (Gold) 【AC自动机+栈】
这个和bzoj同名题不一样,有多个匹配串 但是思路是一样的,写个AC自动机,同样是开两个栈,一个存字符,一个存当前点在trie树上的位置,然后如果到了某个匹配串的末尾,则弹栈 #include< ...
- AC自动机题单
AC自动机题目 真的超级感谢xzy 真的帮到我很多 题单 [X] [luogu3808][模板]AC自动机(简单版) https://www.luogu.org/problemnew/show/P38 ...
- BZOJ2938[Poi2000]病毒——AC自动机
题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...
- [POI2000]病毒 --- AC自动机
[POI2000]病毒 题目描述: 二进制病毒审查委员会最近发现了如下的规律: 某些确定的二进制串是病毒的代码. 如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的. 现在委员会已经找 ...
- 【BZOJ2938】[Poi2000]病毒 AC自动机+DFS
[BZOJ2938][Poi2000]病毒 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码 ...
随机推荐
- javac编译乱码
PersonTest.java:1: 错误: 非法字符: \65279 解决途径如下 用记事本打开java源文件,另存为ANSI格式 如果java文件包含中文字符,使用-encoding gbk格式进 ...
- Kubernetes 概念整理
注:以下大部分内容来自网上摘录,以便后期查阅. Kubernetes (通常称为 K8s) 是用于自动部署.扩展和管理容器化(containerized)应用程序的开源系统,是 Google 内部工具 ...
- Linux下ACL权限控制以及用sudo设置用户对命令的执行权限
ACL权限分配 1.setfacl命令设置文件权限 setfacl -m u:user1:rw root.txt setfacl -m u:user2:rwx root.txt 2.getfacl命令 ...
- 来了解并防范一下CSRF攻击提高网站安全
看一下我从网上找的原理图,结合举例描述,多看一遍你就知道怎么回事了. CSRF是什么呢?CSRF全名是Cross-site request forgery,是一种对网站的恶意利用,CSRF比XSS更具 ...
- 使用CrashHandler来获取应用的crash信息
源码地址https://github.com/king1039/android-art-res/tree/master/Chapter_13/CrashTest/src/com/ryg/crashte ...
- hdu 2047递推
A[N]表示以E或者F结尾的情况下的方案数,B[N]表示以O结尾的情况下的方案数,F[N]=3*A[N-1]+2*B[N-1] 同时,A[N]=2*B[N-1]+2*A[N-1],B[N-1]=A[N ...
- react——一个todolist的demo
代码如下: function ToDoListHeader(props) { return <h1 className={props.className}>ToDoList</h1& ...
- Golang里实现Http服务器并解析header参数和表单参数
在http服务里,header参数和表单参数是经常使用到的,本文主要是练习在Go语言里,如何解析Http请求的header里的参数和表单参数,具体代码如下: package server import ...
- perl的foreach循环的坑
最近在写perl脚本的时候用foreach遍历hash的时候,出现遇到了一个问题,就是说当hash为一层的时候,并不会有问题,但是当hash类型结构比较复杂的时候,就会有需要注意的地方了. 还是举例子 ...
- ffmpeg结构体以及函数介绍(三)
1 AVPacket typedef struct AVPacket { /** * Presentation timestamp in AVStream->time_base units; t ...