双栈+AC自动机

这题其实跟一道KMP算法的题有一些渊源,它就是这道题的简单板。

Clear:

给你两个串A,B,每次在B串中从左到右找串A,并将该子串删除,直到找不到为止,问你能删几次。

样例输入:

abc

abcabcabaabcbccc

样例输出:

5

思路:

开一个栈,每次放入被匹配字符串的一个字符。如果当前栈中字符数量大于等于匹配串的长度,开始匹配,如果有一个单词匹配失败,break掉,继续放字符。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int lc,lb,cnt,flag,ans;
  4. char a[10000001];
  5. string b,c;
  6. int main()
  7. {
  8. cin>>b>>c;
  9. lb=b.size();
  10. lc=c.size();
  11. for(int i=0;i<lc;i++)
  12. {
  13. a[++cnt]=c[i];
  14. if(cnt<b.size())
  15. {
  16. continue;
  17. }
  18. if(a[cnt]!=b[lb-1])
  19. {
  20. continue;
  21. }
  22. flag=0;
  23. for(int i=cnt-lb+1,j=0;i<cnt;i++,j++)//匹配
  24. {
  25. if(a[i]!=b[j])
  26. {
  27. flag=1;//发现目标串,标记。
  28. break;
  29. }
  30. }
  31. if(!flag)
  32. {
  33. ans++;
  34. cnt-=lb;//减长度
  35. }
  36. }
  37. printf("%d\n",ans);//输出
  38. return 0;
  39. }

那么经过这题的思考之后,加强版(就是这题)的思路也应该油然而生了——我们同样用栈做,一个栈命名为s2,用来表示当前节点跑到了AC自动机中的trie树哪里了,另一个栈s3,用来表示最后的字符串留下了原字符串的哪些位上的字符。

如果发现当前这一个栈中的字符的后缀是单词,直接减去单词的长度(所以isword要存的是长度)。

剩下就是输出了。

友情提醒:在洛谷提交的话,末尾最好加个‘\n’。

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int cnt,s2[100010],s3[100010],n,wei,top;//s2是存root,s3是存剩下的。
  4. string s1,s;
  5. queue<int>q;
  6. struct data
  7. {
  8. int b[26],fail,isword;//isword用来存s.size。
  9. }a[1000001];
  10. void build(string t)//建trie树
  11. {
  12. int root=0;
  13. for(int i=0;t[i];i++)
  14. {
  15. int x=t[i]-'a';
  16. if(!a[root].b[x])a[root].b[x]=++cnt;
  17. root=a[root].b[x];
  18. }
  19. a[root].isword=t.size();
  20. }
  21. int main()
  22. {
  23. cin>>s;
  24. scanf("%d",&n);
  25. for(int i=1;i<=n;i++)
  26. {
  27. cin>>s1;
  28. build(s1);
  29. }
  30. for(int i=0;i<26;i++)
  31. {
  32. if(a[0].b[i])
  33. {
  34. q.push(a[0].b[i]);
  35. }
  36. }
  37. while(!q.empty())
  38. {
  39. int k=q.front();
  40. q.pop();
  41. for(int i=0;i<26;i++)
  42. {
  43. if(a[k].b[i])
  44. {
  45. a[a[k].b[i]].fail=a[a[k].fail].b[i];
  46. q.push(a[k].b[i]);
  47. }else{
  48. a[k].b[i]=a[a[k].fail].b[i];
  49. }
  50. }
  51. }
  52. int root=0;
  53. //双栈走起
  54. while(wei<s.size())
  55. {
  56. int x=s[wei]-'a';
  57. root=a[root].b[x];
  58. s2[++top]=root;
  59. s3[top]=wei;
  60. if(a[root].isword)
  61. {
  62. top-=a[root].isword;
  63. if(top==0)
  64. {
  65. root=top;
  66. }else{
  67. root=s2[top];
  68. }
  69. }
  70. wei++;
  71. }
  72. for(int i=1;i<=top;i++)
  73. {
  74. cout<<s[s3[i]];
  75. }
  76. putchar('\n');
  77. return 0;
  78. }

QAQAQAQ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 洛谷 P3120 [USACO15FEB]牛跳房子(金)Cow Hopscotch (Gold)

    P3120 [USACO15FEB]牛跳房子(金)Cow Hopscotch (Gold) 就像人类喜欢跳格子游戏一样,FJ的奶牛们发明了一种新的跳格子游戏.虽然这种接近一吨的笨拙的动物玩跳格子游戏几 ...

  9. 洛谷P3120 [USACO15FEB]牛跳房子(动态开节点线段树)

    题意 题目链接 Sol \(f[i][j]\)表示前\(i\)行\(j\)列的贡献,转移的时候枚举从哪里转移而来,复杂度\(O(n^4)\) 然后考虑每一行的贡献,动态开节点线段树维护一下每种颜色的答 ...

随机推荐

  1. 一个PHP文件搞定微信H5支付

     / 更新于 2018-07-02 / 8 条评论 过年期间也坚持要撸码啊接着给博客除草,在这个小除夕是情人节的一天,祝大家新年快乐,情人节能够顺利脱单~~~ 回归正题,这篇文章介绍一下微信H5支付, ...

  2. Onethink上传服务器后登录不了的问题

    本地修改完Onethink后上传到服务器,进入后台登录的时候,发现输入用户名和密码和验证码后,第一次点击登录没反应,第二次点击提示验证码错误. 经过一研究发现 onethink 的登陆是通过API连接 ...

  3. mac 安装redis及phpredis扩展

    下载phpredis扩展安装包.git clone https://github.com/nicolasff/phpredis.git: 解压后,进入该目录: 依次执行以下操作完成安装: /Appli ...

  4. SpringCloud-动态配置变化监控-获取变化(支持Config、Nacos)

    SpringCloud-动态配置变化监控-获取变化(支持Config.Nacos) qq交流群: 812321371 微信交流群: MercyYao 简介 配置中心有原生的 SpringCloud C ...

  5. 网关服务自定义路由规则(springcloud+nacos)

    1. 场景描述 需要给各个网关服务类提供自定义配置路由规则,实时生效,不用重启网关(重启风险大),目前已实现,动态加载自定义路由文件,动态加载路由文件中的路由规则,只需在规则文件中配置下规则就可以了 ...

  6. Unreal Engine 4 系列教程 Part 4:UI教程

    .katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...

  7. springboot配置logback日志

    springboot配置logback日志 java web 下有好几种日志框架,比如:logback,log4j,log4j2(slj4f 并不是一种日志框架,它相当于定义了规范,实现了这个规范的日 ...

  8. 如何正确的在 Android 上使用协程 ?

    前言 你还记得是哪一年的 Google IO 正式宣布 Kotlin 成为 Android 一级开发语言吗?是 Google IO 2017 .如今两年时间过去了,站在一名 Android 开发者的角 ...

  9. 【前端词典】4 个实用有趣的 JS 特性

    前言 最近在学习的过程中发现了我之前未曾了解过的一些特性,发现有些很有趣并且在处理一些问题的时候可以给我一个新的思路. 这里我将这些特性介绍给大家. 4 个有趣的 JS 特性 利用 a 标签解析 UR ...

  10. Oracle11g入门

    数据类型 数据类型 表示 数字 number 日期时间 date 字符串 char(长度)/varchar2(长度) 约束条件 名称 约束 唯一 unique 非空约束 not null 主键约束 p ...