CENSORING——AC 自动机

题目

【题目描述】

FJ 为它的奶牛订阅了很多杂志,balabala.......,其中有一些奶牛不宜的东西 (比如如何煮牛排)。

FJ 将杂志中所有的文章提取出来组成一个长度最多为 $ 10^5 $ 的字符串 S。他有一个要从 S 中删除的词语的列表,$ t_1,t_2...t_n $。

FJ 每次找到最早的出现在列表里的子串,然后将其删去。他重复此过程,直到找不到这样的子串。值得注意的是删除一个单词可能产生一个新的之前并没有出现过的要被删除的单词。

FJ 保证列表中没有一个字符串是另一个字符串的子串。要就是说每次要删的单词是唯一确定的。

帮助 FJ 确定最终 S 的删减版。

【输入格式】

第一行 S,第二行  $N$,接下来 $n$ 行 $t_1,t_2,...t_n$。所有字符串只包含小写字母,所有字符串的总长不超过 $10^5$。

【输出格式】

S 的删减版。保证结果不为空  

【样例输入】

begintheescapexecutionatthebreakofdawn
2
escape
execution

【样例输出】

beginthatthebreakofdawn

题解

对于 T 建 AC 自动机,然后将 $ S $ 逐位压入栈中,跑 AC 自动机,当当前节点为 $ T_i $ 的结尾时,弹出即可

代码

 1 #include<bits/stdc++.h>
 2 #define LL long long
 3 #define _(d) while(d(isdigit(ch=getchar())))
 4 using namespace std;
 5 int R(){
 6     int x;bool f=1;char ch;_(!)if(ch==‘-‘)f=0;x=ch^48;
 7     _()x=(x<<3)+(x<<1)+(ch^48);return f?x:-x;}
 8 const int N=1e5+5;
 9 int n,cnt,fa[N],pre[N],top,num[N],las[N],sta[N],tr[N][28],fail[N];
10 char str[N],ch[N];
11 void insert(int k){
12     int len=strlen(ch+1),x=0;
13     for(int i=1;i<=len;i++){
14         if(!tr[x][ch[i]-‘a‘])tr[x][ch[i]-‘a‘]=++cnt,fa[cnt]=x;
15         x=tr[x][ch[i]-‘a‘];
16     }
17     num[k]=len,pre[x]=k;
18 }
19 void build(){
20     queue<int>q;
21     for(int i=0;i<26;i++)
22         if(tr[0][i])q.push(tr[0][i]);
23     while(!q.empty()){
24         int x=q.front();q.pop();
25         for(int i=0;i<26;i++)
26             if(tr[x][i])
27                 fail[tr[x][i]]=tr[fail[x]][i],q.push(tr[x][i]);
28             else tr[x][i]=tr[fail[x]][i];
29     }
30 }
31 int main(){
32     scanf("%s",str+1);
33     int len=strlen(str+1);n=R();
34     for(int i=1;i<=n;i++)
35         scanf("%s",ch+1),insert(i);
36     build();
37     for(int i=1,x=0;i<=len;i++){
38         sta[++top]=i;
39         int p=str[i]-‘a‘,y=tr[x][p];
40         if(y&&pre[y])
41             top-=num[pre[y]],x=las[sta[top]];
42         else las[i]=x=y;
43     }
44     for(int i=1;i<=top;i++)
45         putchar(str[sta[i]]);
46     return puts(""),0;
47 }

原文地址:https://www.cnblogs.com/chmwt/p/10662042.html

时间: 2024-10-09 05:44:28

CENSORING——AC 自动机的相关文章

【BZOJ3940】【Usaco2015 Feb】Censoring AC自动机

链接: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/44960463"); } 题意: 题意同BZOJ3942,不过要删除的串是多串 http://blog.csdn.net/vmurder/article/details/44959895 题解: --思路一模一样,除了不用kmp用AC

bzoj 3940: [Usaco2015 Feb]Censoring -- AC自动机

3940: [Usaco2015 Feb]Censoring Time Limit: 10 Sec  Memory Limit: 128 MB Description Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so they have plenty of material to read while waiting around in the barn during

bzoj3940 censoring 题解(AC自动机)

题目描述 Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so they have plenty of material to read while waiting around in the barn during milking sessions. Unfortunately, the latest issue contains a rather inappropria

【AC自动机】Censoring

[题目链接] https://loj.ac/problem/10059 [题意] 有一个长度不超过  1e5 的字符串 .Farmer John 希望在 T 中删掉 n 个屏蔽词(一个屏蔽词可能出现多次),这些词记为 P1,P2……Pn. [题解] 利用栈来进行匹配删除即可. 1.建模式串的AC自动机.(结尾位置记录长度) 2.利用文本串跑一遍AC自动机. 3.在跑的过程中,如果遇到屏蔽字的结尾时,相应操作为:1.把栈里弹出模式串的长度,2.同时文本串继续跑. 4.跑的过程中还需要一个辅助的数组

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

这个和bzoj同名题不一样,有多个匹配串 但是思路是一样的,写个AC自动机,同样是开两个栈,一个存字符,一个存当前点在trie树上的位置,然后如果到了某个匹配串的末尾,则弹栈 #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int N=100005; int n,t[N],top; char a[N],b[N],s

AC自动机总结

AC自动机总结 自动机的概念: 自动机又称有限状态机,是从初始状态不断接受输入,根据输入数据和当前状态跳转到下一状态的一种机器. AC自动机可以实现多串匹配单串.复杂度是\(O(n+m)\),也就是匹配串长+模式串总长. AC自动机匹配失配时,类似KMP算法的next数组,AC自动机上有fail指针可以跳到下一个应该进行匹配的状态. fail指针的一般定义是:沿着父亲的fail指针一直向上跳,直到跳到某一个节点,这个节点拥有与自己相同字母的子节点,那么fail指针就指向这个相同字母的子节点. 一

AC自动机学习小结

AC自动机 简要说明 \(AC\) 自动机,全称 \(Aho-Corasick\ automaton\) ,是一种有限状态自动机,应用于多模式串匹配.在 \(OI\) 中通常搭配 \(dp\) 食用.因为它是状态自动机. 感性理解:在 \(Trie\) 树上加上 \(fail\) 指针.具体的讲解可以去看dalao们的博客(因为我实在是太菜了讲不好). 题目 Keywords Search 题目:给若干个模式串,再给一个文本串,问有几个模式串在文本串中出现过. 板子题.注意一个模式串只被计算一次

暑假集训day9补充(AC自动机)

推荐网站http://blog.csdn.net/niushuai666/article/details/7002823 AC自动机嘛,此AC(aho-corasick)非彼AC(Accepted). 我也不是很会解释 有一题是必须打的hdu2222. #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int mn=

ac自动机基础模板(hdu2222)

In the modern time, Search engine came into the life of everybody like Google, Baidu, etc. Wiskey also wants to bring this feature to his image retrieval system. Every image have a long description, when users type some keywords to find the image, th