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

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

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

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

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#define N 2222222
#define eps 1e-8
using namespace std;
int last,tot,ch[N][],par[N],mx[N];
void add(int c){
int p=last,np=++tot;mx[np]=mx[p]+;
for(;p&&!ch[p][c];p=par[p])ch[p][c]=np;
if(!p)par[np]=;
else{
int q=ch[p][c];
if(mx[q]==mx[p]+)par[np]=q;
else{
int nq=++tot;
mx[nq]=mx[p]+;
par[nq]=par[q];
memcpy(ch[nq],ch[q],sizeof ch[nq]);
par[q]=par[np]=nq;
for(;p&&ch[p][c]==q;p=par[p])ch[p][c]=nq;
}
}last=np;
}
char s[N];
int n,m,len;
int pp[N],f[N];
void dfs(int v,int x,int l){
int t=s[x+]-'';pp[x]=l;
if(x==len)return ;
if(ch[v][t])dfs(ch[v][t],x+,l+);
else{
while(!ch[v][t])v=par[v],l=min(l,mx[v]);
dfs(ch[v][t],x+,l+);
}
}
int head,tail,q[N];
bool check(int x){
head=;tail=;
for(int i=;i<=len;i++){
f[i]=f[i-];
while(head<=tail&&q[head]<i-pp[i])head++;
if(head<=tail)f[i]=max(f[i],f[q[head]]+(i-q[head]));
if(i+-x>=){
int t=i+-x;
while(head<=tail&&f[t]-t>=f[q[tail]]-q[tail])tail--;
q[++tail]=t;
}
}
double ans=f[len],tot=len;
return ans>=(tot*0.9-eps);
}
int main(){
mx[]=-;
for(int i=;i<;i++)ch[][i]=;
last=++tot;
scanf("%d%d",&n,&m);
while(m--){
scanf("%s",s);len=strlen(s);
last=;for(int j=;j<len;j++)add(s[j]-'');
}
while(n--){
scanf("%s",s+);
len=strlen(s+);
dfs(,,);
int l=,r=len,mid,ans=;
while(l<=r){
mid=(l+r)>>;
if(check(mid)){ans=mid;l=mid+;}
else r=mid-;
}
printf("%d\n",ans);
}
return ;
}

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. Kubernetes如何支持有状态服务的部署?

    作者:Jack47 转载请保留作者和原文出处 PS:如果喜欢我写的文章,欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. Kubernetes对无状态服务有完善的支持 ...

  2. objc/runtime.h 查看私有api

    objc/runtime.h 相关 Objecitve-C的重要特性是Runtime(运行时),在Interacting with the Runtime(交互运行)中,运行时函数部分,苹果给出了/u ...

  3. 春天aopframework实现

    Java的代码   包 cn.itcast.day3.aopframework; 进口 java.io.IOException的; 进口 的java.io.InputStream; 进口 java.u ...

  4. UML2.0

    一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...

  5. 装修工人如何在网上"找活"

    http://blog.sina.com.cn/s/blog_555e8fe80102wwsz.html ps:其实码农也是一种装修工. 在这个互联网时代,各个行业都在利用网络达到自己的商业目的,作为 ...

  6. "Uncaught object angular.js:36"诡异错误

    这个错误的调用顶级是jQuery.ready()函数,这个错误的原因是如果你在html元素里面定义ng-app,则在JavaScript里面必须初始化这个ngapp,初始化语句是: var AppNa ...

  7. RPi:QT+wiringPi demo程序

    一个项目里面要用到这玩意儿,网上查了几篇文章凑出来最后还是不行,自己灵机一动就成了. 今天再次搜索的时候,发现另一篇文章已经讲明白了,真是欲哭无泪 程序大部分参考的是之前学qt的摸索出来的,其实只要在 ...

  8. HashMap原理浅析

    HashMap概述 HashMap是基于哈希表和Map实现来的,它提供所有可选的映射方式,可以允许使用null键,除了不同步和允许使用null键之外,HashMap和HashTable基本上相同.因此 ...

  9. vue项目在移动端(手机)调试

    查了很长一段时间的资料才搞好. 感悟就是:原来那么简单呐. 首要条件:同一局域网下(大致理解为链接相同的wifi) 1:命令行运行 ipconfig 2: 得到ipv4值, 用该值替换localhos ...

  10. 0513JS数组的定义、遍历、添加

    |数组|-定义方式|--1.new Array();|----空数组|------var attr = new Array();|------lenght:0|------_proto_: Array ...