【bzoj3940】[Usaco2015 Feb]Censoring AC自动机
题目描述
输入
输出
样例输入
begintheescapexecutionatthebreakofdawn
2
escape
execution
样例输出
beginthatthebreakofdawn
题解
AC自动机
基本思路就是记录每匹配一个字符后指针在Trie中的位置,如果碰到单词就退回到这个单词之前的位置。
可以使用一个栈来搞定。
这里还顺便记录了当前的答案串。
然而一开始写的标准AC自动机,T了,于是改Trie图(AC自动机优化?有限状态自动机?),然后飞速跑过,这个优化不是一般的重要。
- #include <cstdio>
- #include <cstring>
- #include <queue>
- using namespace std;
- int next[100010][26] , cnt[100010] , tot = 1 , fail[100010] , sta[100010] , tt;
- char str[100010] , p[100010] , ans[100010];
- queue<int> q;
- void build()
- {
- int x , i , t;
- q.push(1);
- for(i = 0 ; i < 26 ; i ++ ) next[0][i] = 1;
- while(!q.empty())
- {
- x = q.front() , q.pop();
- for(i = 0 ; i < 26 ; i ++ )
- {
- if(next[x][i])
- {
- t = fail[x];
- while(t && !next[t][i]) t = fail[t];
- fail[next[x][i]] = next[t][i];
- q.push(next[x][i]);
- }
- else next[x][i] = next[fail[x]][i];
- }
- }
- }
- int main()
- {
- int n , i , l , lt , now;
- scanf("%s%d" , str , &n);
- l = strlen(str);
- while(n -- )
- {
- scanf("%s" , p);
- lt = strlen(p);
- now = 1;
- for(i = 0 ; i < lt ; i ++ )
- {
- if(!next[now][p[i] - 'a']) next[now][p[i] - 'a'] = ++tot;
- now = next[now][p[i] - 'a'];
- }
- cnt[now] = lt;
- }
- build();
- sta[0] = 1 , now = 1;
- for(i = 0 ; i < l ; i ++ )
- {
- now = next[now][str[i] - 'a'];
- sta[++tt] = now , ans[tt] = str[i];
- if(cnt[now]) tt -= cnt[now] , now = sta[tt];
- }
- for(i = 1 ; i <= tt ; i ++ ) printf("%c" , ans[i]);
- printf("\n");
- return 0;
- }
【bzoj3940】[Usaco2015 Feb]Censoring AC自动机的更多相关文章
- BZOJ3940: [Usaco2015 Feb]Censoring (AC自动机)
题意:在文本串上删除一些字符串 每次优先删除从左边开始第一个满足的 删除后剩下的串连在一起重复删除步骤 直到不能删 题解:建fail 用栈存当前放进了那些字符 如果可以删 fail指针跳到前面去 好菜 ...
- 【BZOJ3940】【BZOJ3942】[Usaco2015 Feb]Censoring AC自动机/KMP/hash+栈
[BZOJ3942][Usaco2015 Feb]Censoring Description Farmer John has purchased a subscription to Good Hoov ...
- bzoj 3940: [Usaco2015 Feb]Censoring -- AC自动机
3940: [Usaco2015 Feb]Censoring Time Limit: 10 Sec Memory Limit: 128 MB Description Farmer John has ...
- [Usaco2015 Feb]Censoring --- AC自动机 + 栈
bzoj 3940 Censoring 题目描述 FJ把杂志上所有的文章摘抄了下来并把它变成了一个长度不超过10^5的字符串S. 他有一个包含n个单词的列表,列表里的n个单词记为T1......Tn. ...
- BZOJ 3940: [Usaco2015 Feb]Censoring AC自动机_栈
Description Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so ...
- [BZOJ3940]:[Usaco2015 Feb]Censoring(AC自动机)
题目传送门 题目描述: FJ把杂志上所有的文章摘抄了下来并把它变成了一个长度不超过105的字符串S.他有一个包含n个单词的列表,列表里的n个单词记为t1…tN.他希望从S中删除这些单词.FJ每次在S中 ...
- bzoj3940: [Usaco2015 Feb]Censoring
AC自动机.为什么洛谷水题赛会出现这种题然而并不会那么题意就不说啦 .终于会写AC自动机判断是否是子串啦...用到kmp的就可以用AC自动机水过去啦 #include<cstdio> #i ...
- 【BZOJ3940】[USACO2015 Feb] Censoring (AC自动机的小应用)
点此看题面 大致题意: 给你一个文本串和\(N\)个模式串,要你将每一个模式串从文本串中删去.(此题是[BZOJ3942][Usaco2015 Feb]Censoring的升级版) \(AC\)自动机 ...
- BZOJ 3940: [Usaco2015 Feb]Censoring
3940: [Usaco2015 Feb]Censoring Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 367 Solved: 173[Subm ...
随机推荐
- Mac上从gitlab上拉项目实战总结
建立公钥,私钥 https://blog.csdn.net/jigongdajiang/article/details/65441923 2019-01-03 比较喜欢使用图形化界面
- TiDB集群手动安装
TIDB的安装 TiDB 是 PingCAP 公司受 Google Spanner / F1 论文启发而设计的开源分布式 HTAP (Hybrid Transactional and Analytic ...
- h5移动端页面meta标签
<!DOCTYPE html> <!-- 使用 HTML5 doctype,不区分大小写 --> <html lang="zh-cmn-Hans"&g ...
- mysql 常用函数,基本使用
1:选中排除表1 连接表2 表3 获取选中表1中部分选中表3 的部分 并且设置选中状态select t1.*,if(t2中t3id=t1.id,1,0)as checked from t1 lefet ...
- Ubuntu设置代理服务器
由于公司网络的原因,apache的网站访问不了,对于需要经常访问apache网站查看文档的我,最近想了一种方法,在自己的阿里云服务器上搭建一个代理服务器.经过查资料,最终决定使用TinyProxy. ...
- Leecode刷题之旅-C语言/python-28.实现strstr()
/* * @lc app=leetcode.cn id=28 lang=c * * [28] 实现strStr() * * https://leetcode-cn.com/problems/imple ...
- 嵌入式linux系统移植(一)
内容: 交叉编译环境 bootloader功能子系统 内核核心子系统 文件系统子系统要点: 搭建交叉编译环境 bootloader的选择和移植 kernel的配置.编译.移植和调 ...
- 【IIS】 常见问题
[IIS] 常见问题 1. IIS 安装 .Net FrameWork 4.0 开始->所有程序->附件->鼠标右键点击“命令提示符”->以管理员身份运行->%windi ...
- redis入门:介绍、特点、安装、各类型常用操作
一.redis介绍 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. Redis支持多种类型的数据结构,如 字符串(strings), 散列(ha ...
- Python进程、线程、协程及IO多路复用
详情戳击下方链接 Python之进程.线程.协程 python之IO多路复用