把模板串建一个广义SAM

然后在线查询,每次在SAM上预处理出一个a[i]表示i位置向前最多能匹配多长的模板串

二分答案L,dp判断,设f[i]为·~i有几个匹配,转移显然是f[i]=max{f[i-1],f[j]+i-j(i-a[i]<=j<=i-L)},根据性质,i-a[i]是单调的(或者直接看a[i]的预处理过程也能看出来),所以这个dp可以用单调队列优化转移,最后判断是否f[n]>=L*0.9

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. const int N=3000005;
  6. int n,m,fa[N],ch[N][2],dis[N],cur=1,con=1,la,a[N],q[N],f[N];
  7. char s[N];
  8. void ins(int c,int id)
  9. {
  10. la=cur,dis[cur=++con]=id;
  11. int p=la;
  12. for(;p&&!ch[p][c];p=fa[p])
  13. ch[p][c]=cur;
  14. if(!p)
  15. fa[cur]=1;
  16. else
  17. {
  18. int q=ch[p][c];
  19. if(dis[q]==dis[p]+1)
  20. fa[cur]=q;
  21. else
  22. {
  23. int nq=++con;
  24. dis[nq]=dis[p]+1;
  25. memcpy(ch[nq],ch[q],sizeof(ch[nq]));
  26. fa[nq]=fa[q];
  27. fa[q]=fa[cur]=nq;
  28. for(;ch[p][c]==q;p=fa[p])
  29. ch[p][c]=nq;
  30. }
  31. }
  32. }
  33. bool ok(int w,int n)
  34. {
  35. int l=1,r=0;//cerr<<w<<endl;
  36. for(int i=1;i<=n;i++)
  37. {
  38. f[i]=f[i-1];
  39. while(l<=r&&q[l]<i-a[i])
  40. l++;
  41. if(l<=r)
  42. f[i]=max(f[i],f[q[l]]+i-q[l]);
  43. if(i-w+1>=0)
  44. {
  45. while(l<=r&&f[q[r]]-q[r]<=f[i-w+1]-(i-w+1))
  46. r--;
  47. q[++r]=i-w+1;
  48. }//cerr<<i<<" "<<f[i]<<endl;
  49. }
  50. return f[n]*10>=n*9;
  51. }
  52. int main()
  53. {
  54. scanf("%d%d",&m,&n);
  55. for(int j=1;j<=n;j++)
  56. {
  57. scanf("%s",s+1);
  58. cur=1;
  59. for(int i=1,len=strlen(s+1);i<=len;i++)
  60. ins(s[i]-'0',i);
  61. }
  62. while(m--)
  63. {
  64. scanf("%s",s+1);
  65. int len=strlen(s+1);
  66. for(int i=1,l=0,p=1;i<=len;i++)
  67. {
  68. int c=s[i]-'0';
  69. if(ch[p][c])
  70. l++,p=ch[p][c];
  71. else
  72. {
  73. for(;p&&!ch[p][c];p=fa[p]);
  74. if(!p)
  75. l=0,p=1;
  76. else
  77. l=dis[p]+1,p=ch[p][c];
  78. }
  79. a[i]=l;//cerr<<i<<" "<<a[i]<<endl;
  80. }
  81. int l=0,r=len,ans=0;
  82. while(l<=r)
  83. {
  84. int mid=(l+r)>>1;
  85. if(ok(mid,len))
  86. l=mid+1,ans=mid;
  87. else
  88. r=mid-1;
  89. }
  90. printf("%d\n",ans);
  91. }
  92. return 0;
  93. }

bzoj 2806: [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(广义后缀自动机 DP 单调队列)

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

  3. BZOJ2806:[CTSC2012]Cheat(广义SAM,二分,DP)

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

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

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

  5. bzoj 2806 [Ctsc2012]Cheat——广义后缀自动机+单调队列优化DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2806 只想着怎么用后缀数据结构做,其实应该考虑结合其他算法. 可以二分那个长度 L .设当前 ...

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

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

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

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

  8. bzoj 2806: [Ctsc2012]Cheat 后缀自动机DP

    2806: [Ctsc2012]Cheat Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 583  Solved: 330[Submit][Statu ...

  9. BZOJ 2806 [Ctsc2012]Cheat ——后缀自动机 单调队列优化DP

    先建出广义后缀自动机. 然后跑出文章中每一个位置的最大匹配距离. 然后定义$f[i]$表示匹配到以$i$结尾的串时,最长的匹配距离. 显然可以二分$L$的取值. 然后容易得到$DP$方程 $f[i]= ...

随机推荐

  1. poj(1011)——Sticks(经典的dfs+剪枝)

    题目的大致意思是: 如今有n根木棍,然后须要把它们拼成相同长度的木棍,问满足这个条件的最短的长度是多少? 想法嘛:那肯定是dfs把长度搜一遍就好,但问题的关键是这里会超时.那么就要用到剪枝的原理了. ...

  2. Creo二次开发--内存清理函数

    我们在处理模型文件时,总会遇到内存环境的清除问题.一个干净的Creo工作环境.是保证工作能顺利完毕的保障. ProMdlEraseNotDisplayed()函数提供了清除未显示模型的功能. 当须要循 ...

  3. jvm 调优(1)概念

    数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值.“引用值”代表了某个对象的引用,而不是对象本身, ...

  4. VS 预先生成事件命令

    宏 说明 $(ConfigurationName) 当前项目配置的名称(例如,“Debug|Any CPU”). $(OutDir) 输出文件目录的路径,相对于项目目录.这解析为“输出目录”属性的值. ...

  5. eclipse创建maven web app

    1 这个功能是由eclipse的插件maven archetype plugin支持的 2 创建过程 File->New->Maven Project 选择archetype为maven- ...

  6. 注意css 小细节 颜色能缩写尽量缩写

    如 background: #333333; 改为 background: #333;

  7. oracle问题系列 : ORA-02290: 违反检查约束条件

    报错如下: ### Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: ORA-022 ...

  8. bzoj2436: [Noi2011]Noi嘉年华

    我震惊了,我好菜,我是不是该退役(苦逼) 可以先看看代码里的注释 首先我们先考虑一下第一问好了真做起来也就这个能想想了 那么离散化时间是肯定的,看一手范围猜出是二维DP,那对于两个会场,一个放自变量, ...

  9. POJ1511 Invitation Cards —— 最短路spfa

    题目链接:http://poj.org/problem?id=1511 Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Tota ...

  10. Python作业之购物商城

    作业:购物商场 1.商品展示,价格 2.银行卡余额 3.付账 程序流程图如下: 代码如下: ShopDisplay = {'} print(ShopDisplay) ShoppingCartPrice ...