题目描述

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

FJ每次在S中找到最早出现的列表中的单词(最早出现指该单词的开始位置最小),然后从S中删除这个单词。他重复这个操作直到S中没有列表里的单词为止。注意删除一个单词后可能会导致S中出现另一个列表中的单词

FJ注意到列表中的单词不会出现一个单词是另一个单词子串的情况,这意味着每个列表中的单词在S中出现的开始位置是互不相同的

请帮助FJ完成这些操作并输出最后的S

输入输出格式

Input

第一行包含S.

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

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

Output

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

输入输出样例

输入样例#1:

begintheescapexecutionatthebreakofdawn

2

escape

execution

输出样例#1:

beginthatthebreakofdawn


题解思路

看到多个串在一个串上匹配啊是吧,这不AC自动机模板(巨难)题吗。

不过我们是要删除串啊,怎么考虑去删掉这些串呢?

首先这个出题人可能语文是体育老师教的,也许是我的语文是体育老师教的(逃

最早出现的列表中的单词(最早出现指该单词的开始位置最小,这TM不是说我们删单词要一个一个按顺序删,而是说,在文本串里最早出现的一个随便哪一个模式串我们把它删掉

然后怎么搞?

我们考虑把不要删除的文本串一次加入一个栈中,要删掉的那个单词在匹配完成时,再从栈里面弹出之前的单词长度即可。最后输出栈

关于AC自动机在这道题的卵用

我们在字典树上跑文本串的时候,可能某一次文本串匹配单词时,那个字典树的节点是空的,所以用fail指针来节省时间和避免错误


YYJ丑陋的代码系列

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
const int N=500001;
struct node{
int fail,ch[26],end;
}t[N];
char SS[N],ss[N],s[N];
int S[N],top,cnt;
void build()
{
int now=0,len=strlen(s);
for(int i=0;i<len;i++)
{
if(!t[now].ch[s[i]-'a'])
t[now].ch[s[i]-'a']=++cnt;
now=t[now].ch[s[i]-'a'];
}
t[now].end=len;
} void get_fail()
{
queue<int>q;
for(int i=0;i<26;i++)
if(t[0].ch[i])q.push(t[0].ch[i]);
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=0;i<26;i++)
{
if(t[u].ch[i])
t[t[u].ch[i]].fail=t[t[u].fail].ch[i],q.push(t[u].ch[i]);
else t[u].ch[i]=t[t[u].fail].ch[i];
}
}
} int main()
{
scanf("%s",ss);
int n;scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",s);
build();
}
get_fail();
int len=strlen(ss),now=0;
for(int i=0;i<len;i++)
{
++top;
S[top]=now;
SS[top]=ss[i];
now=t[now].ch[ss[i]-'a'];
if(t[now].end)
top-=t[now].end,now=S[top+1];
}
for(int i=1;i<=top;i++)
cout<<SS[i];
return 0;
}

[洛谷P3121] 审查(黄金) (AC自动机)的更多相关文章

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

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

  2. 洛谷-P5357-【模板】AC自动机(二次加强版)

    题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,还是要解决跳fail边产生的重复访问,但 ...

  3. 洛谷P2444 病毒【AC自动机】

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

  4. 洛谷P3966 [TJOI2013]单词(AC自动机)

    题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次. 输入输出格式 输入格式: 第一行一个整数N,表 ...

  5. 洛谷P3966 单词 [TJOI2013] AC自动机

    正解:AC自动机 解题报告: 传送门! 先来提供一个40pts错解QAQ 首先看到这题就会想到AC自动机板子题2鸭!然后就照着那题的套路打一下,随便改一点儿,简单来说就是每次经过一个节点都要++,然后 ...

  6. 洛谷P2444 病毒 [POI2000] AC自动机

    正解:AC自动机 解题报告: 传送门! 首先看到这种题目二话不说先把trie树和fail指针建立起来 然后就想鸭,如果我们想让模式串和文本串尽量不能匹配,就要想办法让它跳fail指针,而不是继续往下走 ...

  7. 洛谷2414(构建ac自动机fail树dfs序后遍历Trie树维护bit及询问答案)

    要点 这是一道蔡队题,看我标题行事 任意询问y串上有多少个x串,暴力找每个节点是不是结尾肯定是炸的,考虑本质:如果某节点是x的结尾,根据ac自动机的性质,x一定是此(子)串后缀.又有每个Trie节点的 ...

  8. 洛谷-P3796-【模板】AC自动机(加强版)

    题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,在fail边的基础上再加一个last边, ...

  9. 洛谷.3808/3796.[模板]AC自动机

    题目链接:简单版,增强版 简单版: #include <cstdio> #include <cstring> const int N=1e6+5,S=26; char s[N] ...

随机推荐

  1. MySQL内置函数uuid和uuid_short

    MySQL的uuid这个函数.简要介绍一下. 用法 简单看到,这个值,每次执行都是不同的. 生成规则 第1 2 3 段是与时间有关的. time_low.time_mid.time_high_and_ ...

  2. 如何去掉边框及input的兼容问题?

    右偷个懒,发现别人写的也不错,我就做个小搬运工 如何去掉边框及input的兼容问题? 说到input,又不得不说它的兼容问题.input如何兼容各个浏览器呢? 第一步:清除input的border的默 ...

  3. UVa 1638 Pole Arrangement【递推】

    题意:给出n根高度为1,2,3,---n的杆子,从左边能看到l根,右边能够看到r根,问有多少种可能 看的紫书的思路 先假设已经安排好了高度为2---i的杆子, 那么高度为1的杆子的放置方法有三种情况 ...

  4. passwd文件

    1.查看/etc/passwd [admin@localhost /]$ cat -n /etc/passwd 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1: ...

  5. 路飞学城Python-Day11

    [44.函数-生成器] 需求:有一个列表 [0,1,2,3,4,5,6,7,8,9],对这个列表循环+1 li = [0,1,2,3,4,5,6,7,8,9] li = map(lambda x:x+ ...

  6. js的onclick和jq的click以及on和bind的区别

    onclick和click,只能静态绑定点击事件:bind的可以一次绑定多个事件(click/onmouseover等):on可以动态的绑定事件,当页面加载完成调用on即可

  7. 原生ajax实现文件上传

    视图层 JS 函数:    <input type="file" onchange="sendFile()" id="up" /> ...

  8. LightOJ-1074 Extended Traffic 最短路问题 注意连通性

    题目链接:https://cn.vjudge.net/problem/LightOJ-1074 题意 给一图 求最短路 若最短路<3或没有最短路,则输出'?' 思路 首先注意到可能存在负环,所以 ...

  9. BZOJ 4668 冷战(按秩合并并查集+LCA)

    4668: 冷战 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 627  Solved: 303[Submit][Status][Discuss] D ...

  10. thymeleaf 常用标签

    1.th:field th:field="*{user.sex}" 此标签会自动填充数据,比如用户的性别 user.sex 如果不为空,则会自动勾选上  2.th:each=&qu ...