从原来的单串匹配变成了多串匹配

好像也没什么特别不一样的地方

原来的做法是搞一个栈,之后一旦匹配到就往前弹栈

做法也一样

但是在\(AC\)自动机上暴力跳\(fail\)是要\(T\)的

我们并没有必要去暴力跳\(fail\),只需要存下往后跳\(fail\)能跳到的成功的位置是哪里就好了

这个在预处理的时候处理一下就好了

代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<queue>
  5. #include<stack>
  6. #define LL long long
  7. #define min(a,b) ((a)<(b)?(a):(b))
  8. #define max(a,b) ((a)>(b)?(a):(b))
  9. #define re register
  10. #define maxn 100005
  11. char S[maxn],T[maxn];
  12. inline int read()
  13. {
  14. char c=getchar();
  15. int x=0;
  16. while(c<'0'||c>'9') c=getchar();
  17. while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();
  18. return x;
  19. }
  20. int son[maxn][26],flag[maxn],fail[maxn],vis[maxn],st[maxn],sta[maxn],to[maxn];
  21. int n,cnt,top;
  22. inline void ins()
  23. {
  24. scanf("%s",S+1);
  25. int len=strlen(S+1);
  26. int now=0;
  27. for(re int i=1;i<=len;i++)
  28. {
  29. if(!son[now][S[i]-'a']) son[now][S[i]-'a']=++cnt;
  30. now=son[now][S[i]-'a'];
  31. }
  32. flag[now]=len;
  33. }
  34. inline void Build()
  35. {
  36. std::queue<int> q;
  37. for(re int i=0;i<26;i++) if(son[0][i]) q.push(son[0][i]);
  38. while(!q.empty())
  39. {
  40. int k=q.front();q.pop();
  41. if(flag[fail[k]]) to[k]=fail[k];
  42. else to[k]=to[fail[k]];
  43. for(re int i=0;i<26;i++)
  44. if(son[k][i]) fail[son[k][i]]=son[fail[k]][i],q.push(son[k][i]);
  45. else son[k][i]=son[fail[k]][i];
  46. }
  47. }
  48. inline void AC_query()
  49. {
  50. int len=strlen(T+1);
  51. int now=0;
  52. for(re int i=1;i<=len;i++)
  53. {
  54. now=son[now][T[i]-'a'];
  55. st[++top]=now,sta[top]=i;
  56. for(re int j=now;j;j=to[j])
  57. if(flag[j])
  58. {
  59. int t=flag[j];
  60. while(t--) vis[sta[top--]]=1;
  61. now=st[top];
  62. break;
  63. }
  64. }
  65. for(re int i=1;i<=len;i++) if(!vis[i]) putchar(T[i]);
  66. putchar(10);
  67. }
  68. int main()
  69. {
  70. scanf("%s",T+1);
  71. scanf("%d",&n);
  72. for(re int i=1;i<=n;i++) ins();
  73. Build();
  74. AC_query();
  75. return 0;
  76. }

【[USACO15FEB]审查(黄金)Censoring (Gold)】的更多相关文章

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

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

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

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

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

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

  4. P3121 [USACO15FEB]审查(AC自动机)

    题目: P3121 [USACO15FEB]审查(黄金)Censoring (Gold) 解析: 多字符串匹配,首先想到AC自动机 建立一个AC自动机 因为有删除和拼接这种操作,考虑用栈维护 顺着文本 ...

  5. 【USACO15FEB】审查(黄金)Censoring (Gold)

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

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

    题面 传送门 Sol AC自动机+栈,每次匹配到栈顶减去这个单词的长度,回到之前的状态 最后栈中留下的就是答案 # include <bits/stdc++.h> # define IL ...

  7. 洛谷 P3121 【[USACO15FEB]审查(黄金)Censoring (Gold)】

    被自己学校OJ的毒瘤测评姬卡到自闭 Hash+栈+优化暴力 其实思路也很简单,就是把单词存进一个结构体,记录其哈希值和长度,然后就可以开始匹配了 但是,理论复杂度很高,为\(O(n*length)\) ...

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

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

  9. LuoguP3121 [USACO15FEB]审查(黄金)Censoring (Gold)【Hash做法】By cellur925

    题目传送门 其实这题正解是AC自动机的,字符串哈希吸氧才能过的,但是我太菜了不会...只能先用哈希苟了. 在扫描单词的时候首先把各个单词的哈希值和长度存起来.然后按照长度从小到大将各单词排序.而那个长 ...

随机推荐

  1. 【3dsMax安装失败,如何卸载、安装3dMax 2014?】

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  2. Angular4+NodeJs+MySQL 入门-05 接口调用

    接口调用 今天讲一下,如果在前端页面上通过调用后台接口,返回来的数据.把前面的几章结合起来. 这里所有用的代码在 https://github.com/xiaotuni/angular-map-htt ...

  3. 如何将项目部署到远程的Linux机器上的tomcat上

    下面来练习一下如何将本地的一个项目部署到远程的Linux机器上去. 第一步:将要部署到Linux机器上的项目打成一个war包 war包有一个好处tomcat可以自动解压 第二步:将打好的war上传到L ...

  4. HTML <frameset>不同frame之间传值

    布局 左右30%--70%,点击左边的复选框,右边显示相应的反应. 代码 main2.html <html> <frameset cols="30%, 70%"& ...

  5. WPF 父子窗体联动

    问题: 近段时间,由于项目上的一些原因,设计到在WPF项目使用引用COM组件的问题,部分WPF元素浮动在COM组件之上,并且实现拖.停靠.放大等功能(子窗体不要求等比缩放,只要位置跟随主窗体即可),如 ...

  6. 强哥的分享--如何使用Spring Boot做一个邮件系统

    http://springboot.fun/ actuator是单机.集群环境下要使用Spring Boot Admin将各个单机的actuator集成越来 mvn clean package -Dm ...

  7. 有关satement与preparedstatement

    satement 用于写入数据,例子如下: connection conn=DBHelper.getConnection(); Statement stmt=conn.createStatement( ...

  8. Cocos2d-js 开发记录:声音播放

    声音播放可以使用cc.audioEngine,需要播放的文件在resource.js中进行添加如: button_press_mp3: "res/audio/press.mp3", ...

  9. 安装redis服务端

    1. redis服务端和客户端的安装 [root@xxx ~]# cd /usr/local/src [root@xxx src]# wget http://download.redis.io/rel ...

  10. MySQL远程连接:Host 'x' is not allowed to connect to this MySQL server

    远程连接MySQL时发现如下错误: java.sql.SQLException: null, message from server: "Host '192.168.30.23' is no ...