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+栈. 用一个栈来维护新加的字符串就可以了.. 一开始我非常的 ...
随机推荐
- ecshop3 调用指定分类下推荐/热卖/新品商品,可指定调用数量
第一步:--------------------------------------------------------------------------------------/** * 取指定分 ...
- 【ZOJ 4070】Function and Function
[链接] 我是链接,点我呀:) [题意] [题解] 递归一会. 会发现最后肯定是0,1一直循环. 开始循环之后就直接返回结果就好. [代码] #include <bits/stdc++.h> ...
- (9)使用JdbcTemplate【从零开始学Spring Boot】
整体步骤: (1) 在pom.xml加入jdbcTemplate的依赖: (2) 编写DemoDao类,声明为:@Repository,引入JdbcTemplate (3) 编写DemoS ...
- 洛谷 P3275 BZOJ 2330 [SCOI2011]糖果
题目描述 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配 ...
- fzu 2173 floyd+矩阵快速幂
#include<stdio.h> #define inf 1000000000000000 #define N 100 long long tmp[N][N],ma[N][N]; int ...
- Object对象具体解释(一)之toString
Object作为Java中超然的存在.当中定义了一切对象都共同拥有的方法. 特点: 1. java.lang包在使用的时候无需显示导入.编译时由编译器自己主动导入. 2. Object类是类层次结构的 ...
- Android中验证输入是否为汉字及手机号,邮箱验证,IP地址可用port号验证
1,验证是否为汉字 // 验证昵称 private boolean verifyNickname() { String nickname = edt_username.getText().toStri ...
- C++研究之在开发中你可能没有考虑到的两个性能优化
1:多余的存储引用导致性能减少. 2:利用局部性提高程序性能: 先来说说引用是怎么减少程序性能.个人觉得减少程序性能主要有两个原因,一是数据结构选择不合理,二是多层嵌套循环导致部分代码被多余反复 ...
- Chrome Extension 的 webRequest模块的解读
Chrome Extension 的 webRequest模块的解读 文档在此:http://developer.chrome.com/trunk/extensions/webRequest.ht ...
- leetCode(30):Sort Colors
Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...