BZOJ 3940: [Usaco2015 Feb]Censoring AC自动机_栈
Description
Input
Output
题解:
题中一个条件特别好:
每次只会删掉第一个出现的字符串.
我们开一个栈,维护当前还存在的字符.
对所有模式串建一个 AC 自动机.
匹配模板串的字符.
如果当前匹配到单词,则弹栈,输出该单词,对应再AC自动机上的指针返回到该单词前的节点即可,并继续匹配.
Code:
#include<bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin) // ,freopen(s".out","w",stdout)
#define maxn 200000
using namespace std;
char str[maxn],arr[maxn];
int S[maxn],pos[maxn],top;
namespace AC
{
#define sigma 30
queue<int>Q;
int tot=0,root=0;
int ch[maxn][30],tag[maxn],f[maxn];
void ins(char p[],int n)
{
int x=root;
for(int i=1;i<=n;++i)
{
int c=p[i]-'a';
if(!ch[x][c]) ch[x][c]=++tot;
x=ch[x][c];
}
tag[x]=n;
}
void getfail()
{
for(int i=0;i<sigma;++i) if(ch[root][i]) Q.push(ch[root][i]);
while(!Q.empty())
{
int u=Q.front();Q.pop();
for(int i=0;i<sigma;++i)
{
int q=ch[u][i];
if(!q) { ch[u][i]=ch[f[u]][i]; continue; }
Q.push(q);
f[q]=ch[f[u]][i];
}
}
}
};
int main()
{
// setIO("input");
int len,m;
scanf("%s",str+1),len=strlen(str+1);
scanf("%d",&m);
for(int i=1,a;i<=m;++i)
{
scanf("%s",arr+1), a=strlen(arr+1), AC::ins(arr,a);
}
AC::getfail();
int tr=0;
for(int i=1;i<=len;++i)
{
int c=str[i]-'a';
tr=AC::ch[tr][c];
pos[i]=tr;
S[++top]=i;
if(AC::tag[tr]) top -= AC::tag[tr], tr = pos[S[top]];
}
for(int i=1;i<=top;++i) printf("%c",str[S[i]]);
printf("\n");
return 0;
}
BZOJ 3940: [Usaco2015 Feb]Censoring AC自动机_栈的更多相关文章
- bzoj 3940: [Usaco2015 Feb]Censoring -- AC自动机
3940: [Usaco2015 Feb]Censoring Time Limit: 10 Sec Memory Limit: 128 MB Description Farmer John has ...
- BZOJ 3940: [Usaco2015 Feb]Censoring
3940: [Usaco2015 Feb]Censoring Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 367 Solved: 173[Subm ...
- 【BZOJ3940】【BZOJ3942】[Usaco2015 Feb]Censoring AC自动机/KMP/hash+栈
[BZOJ3942][Usaco2015 Feb]Censoring Description Farmer John has purchased a subscription to Good Hoov ...
- [Usaco2015 Feb]Censoring --- AC自动机 + 栈
bzoj 3940 Censoring 题目描述 FJ把杂志上所有的文章摘抄了下来并把它变成了一个长度不超过10^5的字符串S. 他有一个包含n个单词的列表,列表里的n个单词记为T1......Tn. ...
- 【bzoj3940】[Usaco2015 Feb]Censoring AC自动机
题目描述 Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so they h ...
- BZOJ3940: [Usaco2015 Feb]Censoring (AC自动机)
题意:在文本串上删除一些字符串 每次优先删除从左边开始第一个满足的 删除后剩下的串连在一起重复删除步骤 直到不能删 题解:建fail 用栈存当前放进了那些字符 如果可以删 fail指针跳到前面去 好菜 ...
- Bzoj 3942: [Usaco2015 Feb]Censoring(kmp)
3942: [Usaco2015 Feb]Censoring Description Farmer John has purchased a subscription to Good Hooveske ...
- [BZOJ 3942] [Usaco2015 Feb] Censoring 【KMP】
题目链接:BZOJ - 3942 题目分析 我们发现,删掉一段 T 之后,被删除的部分前面的一段可能和后面的一段连接起来出现新的 T . 所以我们删掉一段 T 之后应该接着被删除的位置之前的继续向后匹 ...
- BZOJ 3942: [Usaco2015 Feb]Censoring
Description 有两个字符串,每次用一个中取出下一位,放在一个字符串中,如果当前字符串的后缀是另一个字符串就删除. Sol KMP+栈. 用一个栈来维护新加的字符串就可以了.. 一开始我非常的 ...
随机推荐
- IE-FSC
Top3: Top2: FSC related to Redis: (Redis = https://www.cnblogs.com/ngtest/p/10693750.html) FSC statu ...
- 【ACM】hdu_zs2_1003_Problem C_201308031012
Problem C Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)Total Subm ...
- Spring MVC-表单(Form)标签-复选框(Checkbox)示例(转载实践)
以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_checkbox.htm 说明:示例基于Spring MVC 4.1.6. 以下示 ...
- Java内联函数
1.内联函数就是指函数在被调用的地方直接展开,编译器在调用时不用像一般函数那样,參数压栈,返回时參数出栈以及资源释放等,这样提高了程序运行速度. 2.Java语言中有一个keywordfinal来指明 ...
- 网络编程中的CAP & 有趣的存储框架(关系型、NoSQL)全图
第七篇 CAP https://zhuanlan.zhihu.com/p/20399316?refer=auxten CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer’s t ...
- poj2135(简单的最小费用流问题)
题目链接:http://poj.org/problem?id=2135 Farm Tour Time Limit: 1000MS Memory Limit: 65536K Total Submis ...
- 数据结构之---C语言实现广义表头尾链表存储表示
//广义表的头尾链表存储表示 //杨鑫 #include <stdio.h> #include <malloc.h> #include <stdlib.h> #in ...
- c21---结构体
// // main.c // 结构体基本概念 // #include <stdio.h> int main(int argc, const char * argv[]) { /* 基本数 ...
- c20---指向函数的指针
// // main.c // 指向函数的指针 #include <stdio.h> void test() { printf("哥被执行了\n"); } int ge ...
- win10查看系统启动项,并且禁用
打开任务管理器,有一个叫做start up的选项卡,里面的东西就是启动项. 右键选中需要disable的,然后禁用.