【AC自动机】Censoring

【题目链接】

https://loj.ac/problem/10059

【题意】

有一个长度不超过  1e5 的字符串 。Farmer John 希望在 T 中删掉 n 个屏蔽词(一个屏蔽词可能出现多次),这些词记为 P1,P2……Pn。

【题解】

利用栈来进行匹配删除即可。

1、建模式串的AC自动机。(结尾位置记录长度)

2、利用文本串跑一遍AC自动机。

3、在跑的过程中,如果遇到屏蔽字的结尾时,相应操作为:1、把栈里弹出模式串的长度,2、同时文本串继续跑。

4、跑的过程中还需要一个辅助的数组记录当前是 匹配到文本串的在AC自动机上的下标。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N = 1e5+100;
 6 char S[N],T[N];
 7 int Trie[N][26],fail[N],End[N];
 8 int n,Ans[N],Back_up[N],top,idx=1;
 9 int Q[N],Head,Tail;
10 void Insert( char s[] , int Id ){
11     int len = 0 , p = 1 ;
12
13     for(int i=0;s[i];i++,len++){
14         int t = s[i] - ‘a‘ ;
15         if( !Trie[p][t] )
16             Trie[p][t] = ++idx ;
17         p = Trie[p][t] ;
18     }
19     End[p] = len ;
20 }
21 void Build(){
22     Head = 1 , Tail = 0 ;
23     for(int i=0;i<26;i++) Trie[0][i] = 1;
24
25     Q[ ++Tail ] = 1 ;
26
27     while( Head <= Tail ){
28         int u = Q[Head++] ;
29         for(int i=0;i<26;i++){
30             int To = Trie[u][i];
31             if(To){
32                 fail[To] = Trie[fail[u]][i];
33                 Q[++Tail] = To ;
34             }else{
35                 Trie[u][i] = Trie[fail[u]][i];
36             }
37         }
38     }
39 }
40
41 int main()
42 {
43     scanf("%s",T);
44     scanf("%d",&n);
45     for(int i=1;i<=n;i++){
46         scanf("%s",S);
47         Insert( S , i );
48     }
49     Build();
50
51     for(int i=0,p=1;T[i];i++){
52         Back_up[i] = p = Trie[p][T[i]-‘a‘];
53         Ans[++top] = i;
54
55         if( End[p] ){
56             top = top - End[p];
57             p = Back_up[Ans[top]];
58         }
59     }
60     for(int i=1;i<=top;i++){
61         putchar(T[Ans[i]]);
62     }
63     putchar(‘\n‘);
64     return 0;
65 }

Censoring

原文地址:https://www.cnblogs.com/Osea/p/11366987.html

时间: 2024-10-09 05:43:31

【AC自动机】Censoring的相关文章

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

【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

洛谷 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

CENSORING——AC 自动机

题目 [题目描述] FJ 为它的奶牛订阅了很多杂志,balabala.......,其中有一些奶牛不宜的东西 (比如如何煮牛排). FJ 将杂志中所有的文章提取出来组成一个长度最多为 $ 10^5 $ 的字符串 S.他有一个要从 S 中删除的词语的列表,$ t_1,t_2...t_n $. FJ 每次找到最早的出现在列表里的子串,然后将其删去.他重复此过程,直到找不到这样的子串.值得注意的是删除一个单词可能产生一个新的之前并没有出现过的要被删除的单词. FJ 保证列表中没有一个字符串是另一个字符

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

HDU 2825 Wireless Password AC自动机+dp

训练赛第二场的I题,上完体育课回来就把这题过了,今天训练赛rank1了,还把大大队虐了,而且我还过了这道题 (虽然我也就过了这道题...),第一次在比赛中手写AC自动机还带dp的,心情大好. 给一个字符串集合,求包含该集合超过K个字符的,长度为L的字符串的个数. 显然是在AC自动机上跑dp,设dp[u][L][k]表示当前在结点u,还要走L步,当前状态为k的个数.一开始第三维表示的是包含k个字符串,但是题目要求不含重复的,那就只能状压了.转移为dp[u][L][k]+=dp[v][L-1][nk