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 milking sessions. Unfortunately, the latest

issue contains a rather inappropriate article on how to cook the perfect steak, which FJ would rather his

cows not see (clearly, the magazine is in need of better editorial oversight).

FJ has taken all of the text from the magazine to create the string S of length at most 10^5 characters.

He has a list of censored words t_1 ... t_N that he wishes to delete from S. To do so Farmer John finds

the earliest occurrence of a censored word in S (having the earliest start index) and removes that instance

of the word from S. He then repeats the process again, deleting the earliest occurrence of a censored word

from S, repeating until there are no more occurrences of censored words in S. Note that the deletion of one

censored word might create a new occurrence of a censored word that didn‘t exist before.

Farmer John notes that the censored words have the property that no censored word appears as a substring of

another censored word. In particular this means the censored word with earliest index in S is uniquely

defined.Please help FJ determine the final contents of S after censoring is complete.

FJ把杂志上所有的文章摘抄了下来并把它变成了一个长度不超过10^5的字符串S。他有一个包含n个单词的列表,列表里的n个单词

记为t_1...t_N。他希望从S中删除这些单词。

FJ每次在S中找到最早出现的列表中的单词(最早出现指该单词的开始位置最小),然后从S中删除这个单词。他重复这个操作直到S中

没有列表里的单词为止。注意删除一个单词后可能会导致S中出现另一个列表中的单词

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

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



Input

The first line will contain S. The second line will contain N, the number of censored words. The next N lines contain the strings t_1 ... t_N. Each string will contain lower-case alphabet characters (in the range a..z), and the combined lengths of all these strings will be at most 10^5.

第一行包含一个字符串S

第二行包含一个整数N

接下来的N行,每行包含一个字符串,第i行的字符串是t_i



Output

The string S after all deletions are complete. It is guaranteed that S will not become empty during the deletion process.

一行,输出操作后的S

Sample Input

begintheescapexecutionatthebreakofdawn
2
escape
execution

Sample Output

beginthatthebreakofdawn

HINT

Source

Gold

#include<map>
#include<cmath>
#include<queue>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define N 100010
char s[N],s1[N],ans[N];
int fail[N],ch[N][26],dep[N];
int n,rt=1,tot=1,q[N],w[N];
void build()
{
    int h=0,t=0,x;
    fail[rt]=rt;
    for(int i=0;i<26;i++)
        if(ch[rt][i]==-1) ch[rt][i]=rt;
        else
        {
            fail[ch[rt][i]]=rt;
            q[++t]=ch[rt][i];
        }
    while(h<t)
    {
        x=q[++h];
        for(int i=0;i<26;i++)
            if(ch[x][i]==-1) ch[x][i]=ch[fail[x]][i];
            else
            {
                fail[ch[x][i]]=ch[fail[x]][i];
                q[++t]=ch[x][i];
            }
    }
}
int main()
{
    scanf("%s",s+1);
    memset(ch,-1,sizeof(ch));
    scanf("%d",&n);
    int len,x,t;
    for(int i=1;i<=n;i++)
    {
        scanf("%s",s1+1);
        len=strlen(s1+1);x=rt;
        for(int i=1;i<=len;i++)
        {
            t=s1[i]-‘a‘;
            if(ch[x][t]==-1) ch[x][t]=++tot;
            x=ch[x][t];
        }
        dep[x]=len;
    }
    build();
    x=rt;len=strlen(s+1);tot=0;w[0]=rt;
    for(int i=1;i<=len;i++)
    {
        ans[++tot]=s[i];
        x=ch[x][s[i]-‘a‘];w[tot]=x;
        if(dep[x]){tot-=dep[x];x=w[tot];}
    }
    for(int i=1;i<=tot;i++) printf("%c",ans[i]);puts("");
    return 0;
}
时间: 2024-10-06 04:40:01

bzoj 3940: [Usaco2015 Feb]Censoring -- AC自动机的相关文章

BZOJ 3942: [Usaco2015 Feb]Censoring

3942: [Usaco2015 Feb]Censoring Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 404  Solved: 221[Submit][Status][Discuss] Description Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so they have plenty of material

BZOJ 3942 Usaco2015 Feb Censoring KMP算法

题目大意:给定两个串A和B,要求将A中删掉所有的B后输出 为何BC群刚有人问完我这题的[C++语法基础题]版之后就出了个KMP版的= = 维护一个栈,将A中的字符依次加进去,一旦A的栈顶出现了B就弹栈 用KMP算法来加速这个过程即可 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 1001001 using namespace st

bzoj3942: [Usaco2015 Feb]Censoring

AC自动机.嗯bzoj3940弱化版.水过去了(跑的慢啊QAQ.想了想可以用hash写.挖坑 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> using namespace std; #define rep(i,s,t) for(int i=s;i<=t;i++) #define clr(x,c) memset

【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

Bzoj3940 [Usaco2015 Feb]Censoring

Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 391  Solved: 183 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 milking

[BZOJ 3172] [Tjoi2013] 单词 【AC自动机】

题目链接:BZOJ - 3172 题目分析: 题目要求求出每个单词出现的次数,如果把每个单词都在AC自动机里直接跑一遍,复杂度会很高. 这里使用AC自动机的“副产品”——Fail树,Fail树的一个性质是,一个字符串出现的次数,就等于以它的结点为根的Fail树中的子树中所有结点的 Cnt 和. 所以把每个单词插入的时候每个字符都 ++Cnt ,在建 Fail 的时候将结点依次压入一个栈,最后再从栈顶开始弹栈,更新栈顶元素的 Fail 的 Cnt 值,这样就是自叶子节点向上更新了. 我开始写的时候

[Usaco2015 Feb]Censoring

A. Censoring 题目描述 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 rathe

BZOJ 1009: [HNOI2008]GT考试 AC自动机+矩阵快速幂

经典题目了....虽然只有一个不能出现的字符串,但还是写了ac自动机 1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2051  Solved: 1257 [Submit][Status][Discuss] Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0<=Ai<

BZOJ 1030: [JSOI2007]文本生成器( AC自动机 + dp )

之前一直没调出来T^T...早上刷牙时无意中就想出错在哪里了... 对全部单词建AC自动机, 然后在自动机上跑dp, dp(i, j)表示匹配到了第i个字符, 在自动机上的j结点的方案数, 然后枚举A~Z进行转移. -------------------------------------------------------------------------- #include<bits/stdc++.h> using namespace std; #define idx(c) ((c) -