Description

Input

第一行两个整数N,M表示待检查的作文数量,和小强的标准作文库的行数
接下来M行的01串,表示标准作文库
接下来N行的01串,表示N篇作文

Output

N行,每行一个整数,表示这篇作文的L0值。

Sample Input

1 2
10110
000001110
1011001100

Sample Output

4

HINT

输入文件不超过1100000字节

注意:题目有改动,可识别的长度不小于90%即可,而不是大于90%

Solution

首先把广义$SAM$建出来,然后考虑对于一个询问,

我们可以把这个作文放到$SAM$上跑,就可以求得这个字符串的每个位置向前延伸仍然可以匹配的最大长度,记为$Len[i]$。

因为直接求答案不好求,所以我们二分一个答案$lim$

剩下的就是$DP$了。$f[i]$表示到第$i$个位置最多能匹配多少,转移显然。

$f[i]=max(f[i-1]),\sum_{j=lim}^{len} f[i-j]+j$。 单调队列优化一下即可。

Code

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #define N (2200009)
  5. using namespace std;
  6.  
  7. int n,m,len,Len[N],f[N],q[N];
  8. char s[N];
  9.  
  10. struct SAM
  11. {
  12. int son[N][],fa[N],step[N];
  13. int p,q,np,nq,last,cnt;
  14. SAM(){last=cnt=;}
  15.  
  16. void Insert(int x)
  17. {
  18. p=last; np=last=++cnt; step[np]=step[p]+;
  19. while (p && !son[p][x]) son[p][x]=np,p=fa[p];
  20. if (!p) fa[np]=;
  21. else
  22. {
  23. q=son[p][x];
  24. if (step[q]==step[p]+) fa[np]=q;
  25. else
  26. {
  27. nq=++cnt; step[nq]=step[p]+;
  28. memcpy(son[nq],son[q],sizeof(son[q]));
  29. fa[nq]=fa[q]; fa[q]=fa[np]=nq;
  30. while (son[p][x]==q) son[p][x]=nq,p=fa[p];
  31. }
  32. }
  33. }
  34. void Find(char s[])
  35. {
  36. int now=,len=;
  37. for (int i=,l=strlen(s); i<l; ++i)
  38. {
  39. int c=s[i]-'';
  40. if (son[now][c]) ++len,now=son[now][c];
  41. else
  42. {
  43. while (now && !son[now][c]) now=fa[now];
  44. if (!now) len=,now=;
  45. else len=step[now]+,now=son[now][c];
  46. }
  47. Len[i+]=len;
  48. }
  49. }
  50. }SAM;
  51.  
  52. bool check(int lim)
  53. {
  54. int head=,tail=,len=strlen(s);
  55. for (int i=; i<=len; ++i)
  56. {
  57. f[i]=f[i-];
  58. if (i-lim<) continue;
  59. while (head<=tail && f[q[tail]]-q[tail]<=f[i-lim]-i+lim) --tail;
  60. q[++tail]=i-lim;
  61. while (head<=tail && q[head]<i-Len[i]) ++head;
  62. if (head<=tail) f[i]=max(f[i],f[q[head]]+i-q[head]);
  63. }
  64. return f[len]*>=len*;
  65. }
  66.  
  67. int main()
  68. {
  69. scanf("%d%d",&n,&m);
  70. for (int i=; i<=m; ++i,SAM.last=)
  71. {
  72. scanf("%s",s);
  73. for (int j=,l=strlen(s); j<l; ++j)
  74. SAM.Insert(s[j]-'');
  75. }
  76. for (int i=; i<=n; ++i)
  77. {
  78. scanf("%s",s);
  79. SAM.Find(s);
  80. int l=,r=strlen(s),ans=;
  81. while (l<=r)
  82. {
  83. int mid=(l+r)>>;
  84. if (check(mid)) ans=mid,l=mid+;
  85. else r=mid-;
  86. }
  87. printf("%d\n",ans);
  88. }
  89. }

BZOJ2806:[CTSC2012]Cheat(广义SAM,二分,DP)的更多相关文章

  1. 【BZOJ 2806】 2806: [Ctsc2012]Cheat (SAM+二分+DP+单调队列)

    2806: [Ctsc2012]Cheat Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1262  Solved: 643 Description ...

  2. bzoj 2806: [Ctsc2012]Cheat【广义SAM+二分+dp+单调队列】

    把模板串建一个广义SAM 然后在线查询,每次在SAM上预处理出一个a[i]表示i位置向前最多能匹配多长的模板串 二分答案L,dp判断,设f[i]为·~i有几个匹配,转移显然是f[i]=max{f[i- ...

  3. BZOJ.2806.[CTSC2012]Cheat(广义后缀自动机 DP 单调队列)

    题目链接 首先二分答案L.然后就是判断能否将原串划分出一些长度不小于L的子串,这些子串要是给定n个串中的某个串的子串,且满足它们的长度之和不小于原串长度的90%. 贪心多长选一段什么的显然不对.老老实 ...

  4. 【BZOJ2806】[Ctsc2012]Cheat 广义后缀自动机+二分+单调队列优化DP

    [BZOJ2806][Ctsc2012]Cheat Description Input 第一行两个整数N,M表示待检查的作文数量,和小强的标准作文库的行数接下来M行的01串,表示标准作文库接下来N行的 ...

  5. [bzoj2806][Ctsc2012]Cheat(后缀自动机(SAM)+二分答案+单调队列优化dp)

    偷懒直接把bzoj的网页内容ctrlcv过来了 2806: [Ctsc2012]Cheat Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1943   ...

  6. BZOJ 2806: [Ctsc2012]Cheat [广义后缀自动机 单调队列优化DP 二分]

    2806: [Ctsc2012]Cheat 题意: 多个主串和多个询问串,每次询问将询问串分成多个连续子串,如果一个子串长度>=L且在主串中出现过就是熟悉的 如果熟悉的字符串长度>=询问串 ...

  7. bzoj2806: [Ctsc2012]Cheat(SAM+DP)

    2806: [Ctsc2012]Cheat 题目:传送门 题解: 感觉这题考的更多的就是DP啊... 看完题目的第一反应就是广义SAM...(然而并不会) 再YY一会儿想起来可以直接将作文库连成一个母 ...

  8. BZOJ 2806 Luogu P4022 [CTSC2012]Cheat (广义后缀自动机、DP、二分、单调队列)

    题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=2806 (luogu) https://www.luogu.org/pro ...

  9. BZOJ 2806 [Ctsc2012]Cheat (后缀自动机+二分+单调队列+dp)

    题目大意: 给你一堆模式串和文本串 对于每个文本串,我们可以把它不可重叠地拆分成很多子串,如果拆分出的串作为子串出现在了任何一个模式串中,我们称它是“眼熟的”,我们必须保证“眼熟的”子串总长度不小于文 ...

随机推荐

  1. MyEclipse中新建JSP页面编码设置(UTF-8)

    今天再次遭遇反人类的Eclipse,新建JSP页面编码竟然是不是UTF8,导致各种乱码.做下面的修改就能避免这个问题了.

  2. ECharts3.0饼状图使用问题总结

    前提:本人使用的是IE9浏览器 1.IE中无法显示,谷歌却显示正常的问题: 1)情况一 var myChart_cols<%=i%> = echarts.init(document.get ...

  3. Spring 核心组件总结

    spring核心组件总结 spring介绍 spring概念 IOC: Inverse Of Control 控制反转 ​ 将我们创建对象的方式反转了,以前创建对象是由我们开发人员自己维护,包括依赖注 ...

  4. mysql 修改初始化密码【转】

    转:http://www.jb51.net/article/39454.htm 方法1: 用SET PASSWORD命令 首先登录MySQL. 格式:mysql> set password fo ...

  5. mysql information_schema介绍

    mysql information_schema介绍 一.information_schema是什么 information_schema是MySQL自带的一个信息数据库,其保存着关于MySQL服务器 ...

  6. BZOJ4466 [Jsoi2013]超立方体

    Description 定义"超立方图"为:有\(2^k\)个点,以\(k\)位二进制数编号,两个点之间有边当且仅当它们的编号恰有一位不同.给出一个图,问它是否与"超立方 ...

  7. Unable to load script from assets 'index.android.bundle' 出错?

    野路子太多,坑人真的!F**k 言归正传,当你运行 react native 程序的时候出现这个错误 ,如果您使用Windows,请按以下方式运行命令,或者如果出现错误“无法找到条目文件index.a ...

  8. 移动端meta标签设置

    移动端meta标签设置 1.设置当前html文件的字符编码 <meta charset="UTF-8"> 1 2设置浏览器的兼容模式(让IE使用最新的浏览器渲染) &l ...

  9. Intel超低功耗CPU的一些信息

    2015年底: Intel Braswell是专门针对超低功耗移动和桌面平台的一个家族,现有赛扬N3000/N3050/N3150.奔腾N3700四款型号,其中N300的热设计功耗只有区区4W,其他三 ...

  10. Gson基本操作,JsonObject,JsonArray,String,JavaBean,List互转

    (转自)https://www.cnblogs.com/robbinluobo/p/7217387.html String.JsonObject.JavaBean 互相转换 User user = n ...