我们的目的就是找到一个最大的L0,使得该串的90%可以被分成若干长度>L0的字典串中的子串。

明显可以二分答案,对于二分的每个mid

我们考虑dp:f[i]表示前i个字符,最多能匹配上多少个字符。

发现转移端点是个不断前进的区间,单调队列优化就可以了。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <cmath>
  6. #define N 2222222
  7. #define eps 1e-8
  8. using namespace std;
  9. int last,tot,ch[N][],par[N],mx[N];
  10. void add(int c){
  11. int p=last,np=++tot;mx[np]=mx[p]+;
  12. for(;p&&!ch[p][c];p=par[p])ch[p][c]=np;
  13. if(!p)par[np]=;
  14. else{
  15. int q=ch[p][c];
  16. if(mx[q]==mx[p]+)par[np]=q;
  17. else{
  18. int nq=++tot;
  19. mx[nq]=mx[p]+;
  20. par[nq]=par[q];
  21. memcpy(ch[nq],ch[q],sizeof ch[nq]);
  22. par[q]=par[np]=nq;
  23. for(;p&&ch[p][c]==q;p=par[p])ch[p][c]=nq;
  24. }
  25. }last=np;
  26. }
  27. char s[N];
  28. int n,m,len;
  29. int pp[N],f[N];
  30. void dfs(int v,int x,int l){
  31. int t=s[x+]-'';pp[x]=l;
  32. if(x==len)return ;
  33. if(ch[v][t])dfs(ch[v][t],x+,l+);
  34. else{
  35. while(!ch[v][t])v=par[v],l=min(l,mx[v]);
  36. dfs(ch[v][t],x+,l+);
  37. }
  38. }
  39. int head,tail,q[N];
  40. bool check(int x){
  41. head=;tail=;
  42. for(int i=;i<=len;i++){
  43. f[i]=f[i-];
  44. while(head<=tail&&q[head]<i-pp[i])head++;
  45. if(head<=tail)f[i]=max(f[i],f[q[head]]+(i-q[head]));
  46. if(i+-x>=){
  47. int t=i+-x;
  48. while(head<=tail&&f[t]-t>=f[q[tail]]-q[tail])tail--;
  49. q[++tail]=t;
  50. }
  51. }
  52. double ans=f[len],tot=len;
  53. return ans>=(tot*0.9-eps);
  54. }
  55. int main(){
  56. mx[]=-;
  57. for(int i=;i<;i++)ch[][i]=;
  58. last=++tot;
  59. scanf("%d%d",&n,&m);
  60. while(m--){
  61. scanf("%s",s);len=strlen(s);
  62. last=;for(int j=;j<len;j++)add(s[j]-'');
  63. }
  64. while(n--){
  65. scanf("%s",s+);
  66. len=strlen(s+);
  67. dfs(,,);
  68. int l=,r=len,mid,ans=;
  69. while(l<=r){
  70. mid=(l+r)>>;
  71. if(check(mid)){ans=mid;l=mid+;}
  72. else r=mid-;
  73. }
  74. printf("%d\n",ans);
  75. }
  76. return ;
  77. }

bzoj2806 [Ctsc2012]Cheat的更多相关文章

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

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

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

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

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

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

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

    题目 输入格式 第一行两个整数N,M表示待检查的作文数量,和小强的标准作文库 的行数 接下来M行的01串,表示标准作文库 接下来N行的01串,表示N篇作文 输出格式 N行,每行一个整数,表示这篇作文的 ...

  5. BZOJ2806: [Ctsc2012]Cheat(广义后缀自动机,单调队列优化Dp)

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

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

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

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

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

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

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

  9. 【BZOJ2806】Cheat(后缀自动机,二分答案,动态规划,单调队列)

    [BZOJ2806]Cheat(后缀自动机,二分答案,动态规划,单调队列) 题面 BZOJ 洛谷 题解 很有趣的一道题啊 对于在所有的串上面进行匹配? 很明显的后缀自动机 所以先构建出广义后缀自动机 ...

随机推荐

  1. javascript简单介绍(二)

    晨读单词: onmouseover:鼠标移入 onmouseout:鼠标移出 attribute:属性 node:节点 document:文档 element:元素 textNode:文本节点 app ...

  2. 利用Tess4J实现图片识别

    一.下载 1.进入官网下载页面 https://sourceforge.net/projects/tess4j/ 2.点击download 3.下载后解压,目录如下,圈出的三个文件夹是需要用到的 二. ...

  3. 一些Gym三星单刷的比赛总结

    RDC 2013, Samara SAU ACM ICPC Quarterfinal Qualification Contest G 思路卡成智障呀! Round 1:对着这个魔法阵找了半天规律,效果 ...

  4. Coursera-AndrewNg(吴恩达)机器学习笔记——第一周

    一.初识机器学习 何为机器学习?A computer program is said to learn from experience E with respect to some task T an ...

  5. 从数据库读取数据并动态生成easyui tree构结

    一. 数据库表结构 二.从后台读取数据库生成easyui tree结构的树 1.TreeNode树结点类(每个结点都包含easyui tree 的基本属性信息) import java.io.Seri ...

  6. RabbitMQ 安装 Your installed version of Erlang (6.2) is too old. Please install a more recent version.

    windows安装RabbitMQ时在安装完Erlang语言开发包后,再安装RabbitMQ时报错: Your installed version of Erlang (6.2) is too old ...

  7. rsync 密钥文件错误问题总结

    rsync 可以使用 --password-file 选项指定密钥文件,密钥文件中简单存放 rsync 密码:在第一次使用密钥文件的时候经常遇到文件权限相关问题:这里总结一下,我遇到的问题. 问题描述 ...

  8. Python_NAT

    sockMiddle_server.py import sys import socket import threading #回复消息,原样返回 def replyMessage(conn): wh ...

  9. Thymeleaf中each标签遍历list如何获取index

    <tr th:each="user,userStat:${users}">userStat是状态变量,有 index,count,size,current,even,o ...

  10. PAT1042:Shuffling Machine

    1042. Shuffling Machine (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Shu ...