题目:

P3121 [USACO15FEB]审查(黄金)Censoring (Gold)

解析:

多字符串匹配,首先想到AC自动机

建立一个AC自动机

因为有删除和拼接这种操作,考虑用栈维护

顺着文本串匹配的方向走,将经过的节点放入栈中,若匹配到一个模式串,就将这个模式串弹出,从栈顶开始继续走

我们再维护一个pos数组,用来维护trie树中节点对应在文本串中的位置

代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 1e5 + 10;
  4. int n, num;
  5. int sta[N], pos[N];
  6. char s[N], t[N];
  7. struct node {
  8. int fail, end;
  9. int nx[26];
  10. } e[N];
  11. inline void TrieInsert(char *s) {
  12. int rt = 0, len = strlen(s);
  13. for (int i = 0; i < len; ++i) {
  14. int v = s[i] - 'a';
  15. if (!e[rt].nx[v]) e[rt].nx[v] = ++num;
  16. rt = e[rt].nx[v];
  17. }
  18. e[rt].end = len;
  19. }
  20. queue<int>q;
  21. inline void GetFail() {
  22. for (int i = 0; i < 26; ++i) if (e[0].nx[i]) {
  23. q.push(e[0].nx[i]);
  24. e[e[0].nx[i]].fail = 0;
  25. }
  26. while (!q.empty()) {
  27. int u = q.front();
  28. q.pop();
  29. for (int i = 0; i < 26; ++i) {
  30. if (e[u].nx[i]) {
  31. e[e[u].nx[i]].fail = e[e[u].fail].nx[i];
  32. q.push(e[u].nx[i]);
  33. } else e[u].nx[i] = e[e[u].fail].nx[i];
  34. }
  35. }
  36. }
  37. void query(char *s) {
  38. int rt = 0, top = 0, len = strlen(s);
  39. for (int i = 0; i < len; ++i) {
  40. rt = e[rt].nx[s[i] - 'a'];
  41. sta[++top] = rt;
  42. pos[top] = i;
  43. if (e[rt].end) {
  44. top -= e[rt].end;
  45. rt = sta[top];
  46. }
  47. }
  48. for (int i = 1; i <= top; ++i) printf("%c", s[pos[i]]);
  49. putchar('\n');
  50. }
  51. int main() {
  52. cin >> t;
  53. cin >> n;
  54. for (int i = 1; i <= n; ++i) {
  55. cin >> s;
  56. TrieInsert(s);
  57. }
  58. GetFail();
  59. query(t);
  60. return 0;
  61. }

P3121 [USACO15FEB]审查(AC自动机)的更多相关文章

  1. P4824 [USACO15FEB]Censoring (Silver) 审查(银)&&P3121 [USACO15FEB]审查(黄金)Censoring (Gold)

    P3121 [USACO15FEB]审查(黄金)Censoring (Gold) (银的正解是KMP) AC自动机+栈 多字符串匹配--->AC自动机 删除单词的特性--->栈 所以我们先 ...

  2. 洛谷 P3121 [USACO15FEB]审查(黄金)Censoring (Gold) 【AC自动机+栈】

    这个和bzoj同名题不一样,有多个匹配串 但是思路是一样的,写个AC自动机,同样是开两个栈,一个存字符,一个存当前点在trie树上的位置,然后如果到了某个匹配串的末尾,则弹栈 #include< ...

  3. P3121 [USACO15FEB]审查(黄金)Censoring (Gold)

    吐槽 数据太水了吧,我AC自动机的trie建错了结果只是RE了两个点,还以为数组开小了改了好久 思路 看到多模板串,字符串匹配,且模板串总长度不长,就想到AC自动机 然后用栈维护当前的字符串位置,如果 ...

  4. 洛谷.3121.审查(AC自动机 链表)

    题目链接 //删掉一个单词需要前移一段位置,用链表维护就好了 复杂度O(sum(len)) #include <cstdio> #include <cstring> #defi ...

  5. 「USACO15FEB」「LuoguP3121」审查(黄金)Censoring (Gold)(AC自动机

    题目描述 Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so they h ...

  6. 洛谷P3121 审查(黄金)Censoring(Gold) [USACO15FEB] AC自动机

    正解:AC自动机 解题报告: 传送门! 啊我好呆啊其实就挺模板题的,,,只是要一个栈搞一下,,,然后我就不会了,,,是看了题解才get的,,,QAQ 然后写下解法趴QwQ 首先看到多串匹配不难想到AC ...

  7. 2021.11.09 P4824 [USACO15FEB]Censoring S与P3121 [USACO15FEB]Censoring G(KMP&&AC自动机)

    2021.11.09 P4824 [USACO15FEB]Censoring S与P3121 [USACO15FEB]Censoring G(KMP&&AC自动机) https://w ...

  8. [洛谷P3121] 审查(黄金) (AC自动机)

    题目描述 FJ把杂志上所有的文章摘抄了下来并把它变成了一个长度不超过10^5的字符串S.他有一个包含n个单词的列表,列表里的n个单词记为t_1...t_N.他希望从S中删除这些单词. FJ每次在S中找 ...

  9. 【Luogu3121】审查(AC自动机)

    题面 Description 农夫约翰为他的奶牛们购买了一份名字叫Good Hooveskeeping的定期杂志,因此奶牛们在挤奶期间就有了大量的阅读素材.遗憾的是在最新的一期上,有一篇有点儿不适当的 ...

随机推荐

  1. 冰多多团队-第七次scrum例会

    冰多多团队-第七次Scrum会议 工作情况 团队成员 已完成任务 待完成任务 zpj 接入IAT模块 debug, IAT 牛雅哲 调研科大讯飞SDK中其他模块,寻找符合我们的需求的部分,将接口更换成 ...

  2. answer

    https://www.cnblogs.com/549294286/p/10451394.html 基于BIO实现的Server端,当建立了100个连接时,会有多少个线程?如果基于NIO,又会是多少个 ...

  3. template cannot be keyed. Place the key on real elements instead.

    template cannot be keyed. Place the key on real elements instead. 一.总结 一句话总结: 原因:vue不支持在 template 元素 ...

  4. visual studio 2019 企业版下载

    由于visual studio从2017开始就是网络下载安装,所以网速慢的朋友安装上就存在时间感,所以笔者在百度云上提供了visual studio 2019的下载包.需要的朋友自己下载安装.不过,2 ...

  5. 哈希表查找(散列表查找) c++实现HashMap

    算法思想: 哈希表 什么是哈希表 在前面讨论的各种结构(线性表.树等)中,记录在结构中的相对位置是随机的,和记录的关键字之间不存在确定的关系,因此,在结构中查找记录时需进行一系列和关键字的比较.这一类 ...

  6. Canal - 数据同步 - 阿里巴巴 MySQL binlog 增量订阅&消费组件

    背景 早期,阿里巴巴 B2B 公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求 ,主要是基于trigger的方式获取增量变更.从 2010 年开始,公司开始逐步尝试数据库日志解析,获取增量变 ...

  7. tensorflow 笔记 15:如何使用 Supervisor

    如何使用Supervisor在不使用Supervisor的时候,我们的代码经常是这么组织的 variables ... ops ... summary_op ... merge_all_summari ...

  8. idea 打开eclipse 项目 编译出现 Error:(1, 1) java: 非法字符: ‘\ufeff’

    原因分析: Eclipse可以智能的把UTF-8+BOM文件转为普通的UTF-8文件,IDEA没有这个智能转换. 解决: 1 用IDEA转换,先转换为GBK,再转回UTF-8

  9. c# socket 心跳 重连

    /// <summary> /// 检查一个Socket是否可连接 /// </summary> /// <param name="socket"&g ...

  10. Netty学习-IO体系架构系统回顾 & 装饰模式Decorator的具体使用

    Netty学习-IO体系架构系统回顾 IO和NIO的学习 NIO - 1.4 开始出的 在网络应用框架中,NIO得到了大量的使用,特别是netty里面 前提:对IO及其了解 对IO的总结和回顾 理解J ...