点此看题面

大致题意: 给你一个文本串和\(N\)个模式串,要你将每一个模式串从文本串中删去。(此题是【BZOJ3942】[Usaco2015 Feb]Censoring的升级版)

\(AC\)自动机

这是一道\(AC\)自动机的简单运用题。

题解

我们可以用一个\(ans[\) \(]\)字符数组来存储最后的答案,并用一个\(lst[\) \(]\)数组来记录字符串中每一位上次被访问时所到达的\(Trie\)上的节点。

如果找到了一个长度为\(len\)的模式串要删去,我们可以将\(ans\)的长度\(len_{ans}\)减去\(len\),然后更新当前在\(Trie\)上访问到的节点为\(lst[len_{ans}]\)。

这样不断操作,就可以求出答案了。

代码

  1. #include<bits/stdc++.h>
  2. #define max(x,y) ((x)>(y)?(x):(y))
  3. #define min(x,y) ((x)<(y)?(x):(y))
  4. #define LL long long
  5. #define ull unsigned long long
  6. #define swap(x,y) (x^=y,y^=x,x^=y)
  7. #define tc() (A==B&&(B=(A=ff)+fread(ff,1,100000,stdin),A==B)?EOF:*A++)
  8. #define SUM 100000
  9. char ff[100000],*A=ff,*B=ff;
  10. using namespace std;
  11. int n,rt=1,tot=1,lst[SUM+5];
  12. string st;
  13. char ans[SUM+5];
  14. struct Trie
  15. {
  16. int Son[26],Next,Len;
  17. }node[SUM+5];
  18. queue<int> q;
  19. inline void read(int &x)
  20. {
  21. x=0;static char ch;
  22. while(!isdigit(ch=tc()));
  23. while(x=(x<<3)+(x<<1)+ch-48,isdigit(ch=tc()));
  24. }
  25. inline void read_string(string &x)
  26. {
  27. x="";static char ch;
  28. while(isspace(ch=tc()));
  29. while(x+=ch,!isspace(ch=tc())) if(!(~ch)) return;
  30. }
  31. inline void Insert(string st)
  32. {
  33. register int i,nxt,x=rt,len=st.length();
  34. for(i=0;i<len;++i)
  35. {
  36. if(!node[x].Son[nxt=st[i]-97]) node[x].Son[nxt]=++tot;
  37. x=node[x].Son[nxt];
  38. }
  39. node[x].Len=len;//在当前模式串最后到达的节点记录下当前模式串的长度
  40. }
  41. inline void GetNext()
  42. {
  43. register int i,k;q.push(rt);
  44. while(!q.empty())
  45. {
  46. k=q.front(),q.pop();
  47. for(i=0;i<26;++i)
  48. {
  49. if(k^rt)
  50. {
  51. if(!node[k].Son[i]) node[k].Son[i]=node[node[k].Next].Son[i];
  52. else node[node[k].Son[i]].Next=node[node[k].Next].Son[i],q.push(node[k].Son[i]);
  53. }
  54. else
  55. {
  56. if(!node[k].Son[i]) node[k].Son[i]=rt;
  57. else node[node[k].Son[i]].Next=rt,q.push(node[k].Son[i]);
  58. }
  59. }
  60. }
  61. }
  62. inline void AC_Automation()
  63. {
  64. register int i,j,x=rt,len=st.length(),len_ans=0;
  65. for(GetNext(),i=0;i<len;++i)
  66. {
  67. if(!(x=node[x].Son[(ans[++len_ans]=st[i])-97])) {lst[len_ans]=x=rt;continue;}
  68. lst[len_ans]=x;//用lst[]数组存储下当前位置所对应的Trie上的节点
  69. if(node[x].Len) len_ans-=node[x].Len,x=lst[len_ans];//如果当前位置上有一个字符串,就将其删去,并更新当前Trie上的节点
  70. }
  71. ans[len_ans+1]=0;
  72. }
  73. int main()
  74. {
  75. register int i,j;register string s;
  76. for(read_string(st),read(n),i=1;i<=n;++i) read_string(s),Insert(s);
  77. return AC_Automation(),puts(ans+1),0;
  78. }

【BZOJ3940】[USACO2015 Feb] Censoring (AC自动机的小应用)的更多相关文章

  1. BZOJ3940: [Usaco2015 Feb]Censoring (AC自动机)

    题意:在文本串上删除一些字符串 每次优先删除从左边开始第一个满足的 删除后剩下的串连在一起重复删除步骤 直到不能删 题解:建fail 用栈存当前放进了那些字符 如果可以删 fail指针跳到前面去 好菜 ...

  2. 【BZOJ3940】【BZOJ3942】[Usaco2015 Feb]Censoring AC自动机/KMP/hash+栈

    [BZOJ3942][Usaco2015 Feb]Censoring Description Farmer John has purchased a subscription to Good Hoov ...

  3. bzoj 3940: [Usaco2015 Feb]Censoring -- AC自动机

    3940: [Usaco2015 Feb]Censoring Time Limit: 10 Sec  Memory Limit: 128 MB Description Farmer John has ...

  4. 【bzoj3940】[Usaco2015 Feb]Censoring AC自动机

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

  5. [Usaco2015 Feb]Censoring --- AC自动机 + 栈

    bzoj 3940 Censoring 题目描述 FJ把杂志上所有的文章摘抄了下来并把它变成了一个长度不超过10^5的字符串S. 他有一个包含n个单词的列表,列表里的n个单词记为T1......Tn. ...

  6. BZOJ 3940: [Usaco2015 Feb]Censoring AC自动机_栈

    Description Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so ...

  7. [BZOJ3940]:[Usaco2015 Feb]Censoring(AC自动机)

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

  8. bzoj3940: [Usaco2015 Feb]Censoring

    AC自动机.为什么洛谷水题赛会出现这种题然而并不会那么题意就不说啦 .终于会写AC自动机判断是否是子串啦...用到kmp的就可以用AC自动机水过去啦 #include<cstdio> #i ...

  9. BZOJ 3940: [Usaco2015 Feb]Censoring

    3940: [Usaco2015 Feb]Censoring Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 367  Solved: 173[Subm ...

随机推荐

  1. Spark Streaming 官网上提到的几点调优

    总的来说,需要考虑以下两点: 1. 有效地运用集群资源去减少每个批次处理的时间 2. 正确的设置batch size,以使得处理速度能跟上接收速度 一.  为了减少处理时间,主要有以下几个优化点: 1 ...

  2. 洛谷P1312 Mayan游戏

    P1312 Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他 ...

  3. PAT天梯赛L3-004 肿瘤诊断

    题目链接:点击打开链接 在诊断肿瘤疾病时,计算肿瘤体积是很重要的一环.给定病灶扫描切片中标注出的疑似肿瘤区域,请你计算肿瘤的体积. 输入格式: 输入第一行给出4个正整数:M.N.L.T,其中M和N是每 ...

  4. js和css文件位置对页面性能的影响

    翻译了一篇Performance上的关于页面性能的文章<DecIPhering the critical rendering path>,原文在这里.需要进一步整理和了解有关js.css等 ...

  5. myeclipse svn 在线安装

    https://www.cnblogs.com/sxdcgaq8080/p/6000446.html http://subclipse.tigris.org/update_1.8.x

  6. Memento模式(备忘录设计模式)

    Memento模式? 使用面向对象编程的方式实现撤销功能时,需要事先保存实例的相关状态信息.然后,在撤销时,还需要根据所保存的信息将实例恢复至原来的状态.这个时候你需要使用Memento设计模式.(以 ...

  7. Luogu P4551 最长异或路径 01trie

    做一个树上前缀异或和,然后把前缀和插到$01trie$里,然后再对每一个前缀异或和整个查一遍,在树上从高位向低位贪心,按位优先选择不同的,就能贪出最大的答案. #include<cstdio&g ...

  8. python学习笔记(一)——关于正则表达式的学习小结

    python中提供了re这个模块提供对正则表达式的支持. 一.正则表达式常用到的一些语法(并非全部): . 匹配任意单个字符 [...] 匹配单个字符集 \w 匹配单词字符,即[a-zA-Z0-9] ...

  9. Jmeter4.0----CSV Data Set Config_对输入参数进行参数化(14)

    1.说明 测试接口时,当请求参数不是固定的,每次请求对应的参数都是不同的,就需要对请求参数进行参数化. 2.步骤 第一步:准备数据 (以报告编制人员为例)首先创建.txt文本,自己编辑要参数化的内容 ...

  10. jquery——下载、使用

    jQuery是目前使用最广泛的javascript函数库. 怎样安装? 这是下载地址:https://code.jquery.com/ minified是压缩版的 新建一个网页打开上面这个网址,ctr ...