【题目描述】

给出一个长度为N的小写字母串,现在Mirko有M个若干长度为Li字符串。现在Mirko要用这M个字符串去覆盖给出的那个字符串的。覆盖时,必须保证:
1.Mirko的字符串不能拆开,旋转;
2.Mirko的字符串必须和给出的字符串的某一连续段完全一致才能覆盖,
3.若干次覆盖可以部分重叠
4.Mirko的字符串可以无限使用。
求给出的字符串当中,有多少个字母是无法覆盖的。

【题解】

很魔性的一道题,一看就知道是AC自动机,这里有个小优化,插入时判断一下:如果模式串是文本的子串就插入。

然后就转化为了线段覆盖问题。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<cmath>
  6. #include<ctime>
  7. #include<algorithm>
  8. using namespace std;
  9. #define MAXN 2500010
  10. int n,m,cnt,ans,v[MAXN],q[MAXN],fail[MAXN],k[MAXN],tr[][],vis[][][][][];
  11. char b[MAXN],ch[];
  12. inline int read()
  13. {
  14. int x=,f=; char ch=getchar();
  15. while(!isdigit(ch)) {if(ch=='-') f=-; ch=getchar();}
  16. while(isdigit(ch)) {x=x*+ch-''; ch=getchar();}
  17. return x*f;
  18. }
  19. void insert(int p)
  20. {
  21. int now=;
  22. for(int i=;i<=p;i++)
  23. {
  24. if(!tr[now][ch[i]]) tr[now][ch[i]]=++cnt;
  25. now=tr[now][ch[i]];
  26. }
  27. v[now]=p;
  28. }
  29. void build()
  30. {
  31. int head=,tail=;
  32. for(int i=;i<;i++) if(tr[][i]) q[++tail]=tr[][i];
  33. while(++head<=tail)
  34. {
  35. int x=q[head];
  36. for(int i=;i<;i++)
  37. {
  38. int y=tr[x][i];
  39. if(!y) continue;
  40. q[++tail]=y;
  41. int temp=fail[x];
  42. while(temp&&!tr[temp][i]) temp=fail[temp];
  43. fail[y]=tr[temp][i];
  44. }
  45. }
  46. }
  47. void work()
  48. {
  49. for(int i=,x=;i<=n;i++)
  50. {
  51. while(x&&!tr[x][b[i]]) x=fail[x]; x=tr[x][b[i]]; int temp=x;
  52. while(temp) {if(v[temp]) k[i-v[temp]+]=v[temp]; temp=fail[temp];}
  53. }
  54. for(int i=,last=;i<=n;i++)
  55. {
  56. if(k[i]) last=max(last,k[i]+i-);
  57. if(last<i) ans++;
  58. }
  59. printf("%d\n",ans);
  60. }
  61. int main()
  62. {
  63. //freopen("cin.in","r",stdin);
  64. //freopen("cout.out","w",stdout);
  65. n=read(); scanf("%s",b+);
  66. for(int i=;i<=n;i++) b[i]=b[i]-'a';
  67. for(int i=;i<=n;i++) vis[b[i]][b[i-]][b[i-]][b[i-]][b[i-]]=;
  68. m=read();
  69. for(int i=;i<=m;i++)
  70. {
  71. scanf("%s",ch+); bool flag=; int len=strlen(ch+);
  72. for(int j=;j<=len;j++) ch[j]=ch[j]-'a';
  73. for(int j=;j<=len;j++) if(!vis[ch[j]][ch[j-]][ch[j-]][ch[j-]][ch[j-]]) {flag=;break;}
  74. if(!flag) insert(len);
  75. }
  76. build();
  77. work();
  78. return ;
  79. }

【COCI2012】覆盖字符串的更多相关文章

  1. [coci2012]覆盖字符串 AC自动机

    给出一个长度为N的小写字母串,现在Mirko有M个若干长度为Li字符串.现在Mirko要用这M个字符串去覆盖给出的那个字符串的.覆盖时,必须保证:1.Mirko的字符串不能拆开,旋转:2.Mirko的 ...

  2. JZYZOJ1369 [coci2012]覆盖字符串 AC自动机

    http://172.20.6.3/Problem_Show.asp?id=1369 trie树如果不优化就这么往里面放这么多单词肯定超空间+超时,所以需要去掉无用的字符串(不属于原字符串的),但是一 ...

  3. String类常用方法

    1.String类的特点,字符串一旦被初始化就不会被改变. 2.String对象定义的两种方式 ①String s = "affdf";这种定义方式是在字符串常量池中创建一个Str ...

  4. 2、C#面向对象:封装、继承、多态、String、集合、文件(上)

    面向对象封装 一.面向对象概念 面向过程:面向的是完成一件事情的过程,强调的是完成这件事情的动作. 面向对象:找个对象帮你完成这件事情. 二.面向对象封装 把方法进行封装,隐藏实现细节,外部直接调用. ...

  5. StringUtils方法全集

    org.apache.commons.lang.StringUtils中方法的操作对象是java.lang.String类型的对象,是JDK提供的String类型操作方法的补充,并且是null安全的( ...

  6. Redis常用数据类型介绍、使用场景及其操作命令

    Redis常用数据类型介绍.使用场景及其操作命令 本文章同时也在cpper.info发布. Redis目前支持5种数据类型,分别是: 1.String(字符串) 2.List(列表) 3.Hash(字 ...

  7. redis客户端--jedis

    一.jedis jedis 是 redis推荐的java客户端.通过Jedis我们可以很方便地使用java代码的方式,对redis进行操作.jedis使用起来比较简单,它的操作方法与redis命令相类 ...

  8. C中不安全函数

    C 中大多数缓冲区溢出问题可以直接追溯到标准 C 库.最有害的罪魁祸首是不进行自变量检查的.有问题的字符串操作(strcpy.strcat.sprintf 和 gets).一般来讲,象“避免使用 st ...

  9. Redis基础知识之————php-Redis 常用命令专题

    Keys del,delete - 删除键 dump - 返回存储在指定键值的序列化版本. exists - 确定键是否存在 expire,setTimeout,pexpire - 设置键的生存时间( ...

随机推荐

  1. 机器学习算法实现解析——libFM之libFM的训练过程概述

    本节主要介绍的是libFM源码分析的第四部分--libFM的训练. FM模型的训练是FM模型的核心的部分. 4.1.libFM中训练过程的实现 在FM模型的训练过程中,libFM源码中共提供了四种训练 ...

  2. Django之模板继承

    为了在Django模板配置中减少代码的冗余,需使用模板继承 1. 语法 {% block classinfo %} {% endblock} 2. 步骤 (1)创建一个base.html把需要显示的页 ...

  3. 剑指offer-第五章优化时间和空间效率(连续子数组的最大和)

    题目:输入一个数组,数组中有正也有负,数组中连续的一个或者连续的多个数字组成一个子数组.求所有的子数组和的最大值.要求时间复杂度为O(n) 思路:我们的最直观的想法就是求出这个数组中的所有的子数组,然 ...

  4. 【转】C# Socket编程(2)识别网络主机

    [转自:https://www.cnblogs.com/IPrograming/archive/2012/10/11/CSharp_Socket_2.html] 一个客户端想要发起一次通信,先决条件就 ...

  5. C语言词法分析:C#源码

    今天继续研究代码解析的算法 这个是算法流程图 有图解可能更直观一点: 以下是c#源码:   1using System;   2using System.IO;   3using System.Tex ...

  6. 洛谷 4721 【模板】分治 FFT——分治FFT / 多项式求逆

    题目:https://www.luogu.org/problemnew/show/P4721 分治FFT:https://www.cnblogs.com/bztMinamoto/p/9749557.h ...

  7. 提升Apache网站访问速度的优化方法

    Apache是世界使用排名第一的Web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一. 在Apache服务器上怎样优化才能提高 ...

  8. Crypto 加密解密

    import binascii from Crypto.Cipher import AES #秘钥,此处需要将字符串转为字节 from utils import config from utils.e ...

  9. An internal error occurred during: "Map/Reducelocation status updater".java.lang.NullPointerException

    当我们运行wordcount代码时,出现报错,如下所示: An internal error occurred during: "Map/Reducelocation status upda ...

  10. print 函数用法总结

    1. 字符串和数值类型 >>> print(1) 1 >>> print("Hello World") Hello World 2.变量无论什么 ...