题意

显然这个\(L\)是可以二分的,我们只需要判断\(L\)是否合法即可。

显然有一个\(O(n^2)\)的DP:

设\(f_i\)表示当前匹配到\(i\)的最大匹配长度。

\(f_i=max(f_j+i-(j+1)+1)\ j\in[i-match_i,i-L]\)

其中的\(match_i\)表示前缀\(i\)能和文本库匹配的最长后缀长度,这显然是可以在后缀自动机上匹配求出的。

于是就可以\(O(n^2logn)\)做了。

发现\(i-match_i\)单调递增,于是可以单调队列解决。

证明:

反证即可,如果不单调必定是如下情况:



红线是i匹配的长度,蓝线是i+1匹配的长度,显然i能匹配更长。

code:

#include<bits/stdc++.h>
using namespace std;
const int maxn=2*1e6+10;
int n,m;
int match[maxn],f[maxn],q[maxn];
char s[maxn];
struct SAM
{
int last,tot;
int fa[maxn],len[maxn];
int ch[maxn][2];
SAM(){last=tot=1;}
inline void add(int c)
{
if(ch[last][c]&&len[last]+1==len[ch[last][c]]){last=ch[last][c];return;}
int now=++tot;len[now]=len[last]+1;
int p=last;
while(p&&!ch[p][c])ch[p][c]=now,p=fa[p];
if(!p){fa[now]=1;last=now;return;}
int q=ch[p][c];bool flag=0;
if(len[q]==len[p]+1)fa[now]=q;
else
{
if(p==last)flag=1;
int nowq=++tot;len[nowq]=len[p]+1;
memcpy(ch[nowq],ch[q],sizeof(ch[q]));
fa[nowq]=fa[q],fa[q]=fa[now]=nowq;
while(p&&ch[p][c]==q)ch[p][c]=nowq,p=fa[p];
if(flag)last=nowq;
}
if(!flag)last=now;
}
}sam;
inline void getmatch(char* s)
{
int len=strlen(s+1),now=1,nowl=0;
for(int i=1;i<=len;i++)
{
while(now&&!sam.ch[now][s[i]-'0'])now=sam.fa[now],nowl=sam.len[now];
if(now)now=sam.ch[now][s[i]-'0'],nowl++;
else now=1,nowl=0;
match[i]=nowl;
}
}
inline bool check(int mid,char* s)
{
int l=1,r=0,len=strlen(s+1);
for(int i=0;i<mid;i++)f[i]=0;
for(int i=mid;i<=len;i++)
{
f[i]=f[i-1];
while(l<=r&&f[q[r]]-q[r]<=f[i-mid]-(i-mid))r--;
q[++r]=i-mid;
while(l<=r&&q[l]<i-match[i])l++;
if(l<=r)f[i]=max(f[i],i+f[q[l]]-q[l]);
}
return f[len]*10>=len*9;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
sam.last=1;
scanf("%s",s+1);
int len=strlen(s+1);
for(int j=1;j<=len;j++)sam.add(s[j]-'0');
}
for(int i=1;i<=n;i++)
{
scanf("%s",s+1);
getmatch(s);
int l=0,r=strlen(s+1),ans=0;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid,s))ans=mid,l=mid+1;
else r=mid-1;
}
printf("%d\n",ans);
}
return 0;
}

luoguP4022 [CTSC2012]熟悉的文章的更多相关文章

  1. P4022 [CTSC2012]熟悉的文章

    题目 P4022 [CTSC2012]熟悉的文章 题目大意:多个文本串,多个匹配串,我们求\(L\),\(L\)指(匹配串中\(≥L\)长度的子串出现在文本串才为"熟悉",使得匹配 ...

  2. [CTSC2012]熟悉的文章(后缀自动机+动态规划)

    题目描述 阿米巴是小强的好朋友. 在小强眼中,阿米巴是一个作文成绩很高的文艺青年.为了获取考试作文的真谛,小强向阿米巴求教.阿米巴给小强展示了几篇作文,小强觉得这些文章怎么看怎么觉得熟悉,仿佛是某些范 ...

  3. 【[CTSC2012]熟悉的文章】

    题目 好题啊 \(SAM\)+单调队列优化\(dp\) 首先这个\(L\)满足单调性真是非常显然我们可以直接二分 二分之后套一个\(dp\)就好了 设\(dp[i]\)表示到达\(i\)位置熟悉的文章 ...

  4. [BZOJ2806][CTSC2012]熟悉的文章(Cheat)

    bzoj luogu 题目描述 阿米巴是小强的好朋友. 在小强眼中,阿米巴是一个作文成绩很高的文艺青年.为了获取考试作文的真谛,小强向阿米巴求教.阿米巴给小强展示了几篇作文,小强觉得这些文章怎么看怎么 ...

  5. 题解-CTSC2012 熟悉的文章

    Problem bzoj 题目大意:给定多个标准串和一个文本串,全部为01串,如果一个串长度不少于\(L\)且是任意一个标准串的子串,那么它是"熟悉"的.对于文本串\(A\),把\ ...

  6. CTSC2012 熟悉的文章

    传送门 首先很容易想到对于所有的模式串建出广义后缀自动机,之后对于我们每一个要检查的文本串,先在SAM上跑,计算出来每一个位置能匹配到的最远的位置是多少.(就是当前点减去匹配长度) 之后--考虑DP- ...

  7. Luogu4022 CTSC2012 熟悉的文章 广义SAM、二分答案、单调队列

    传送门 先将所有模板串扔进广义SAM.发现作文的\(L0\)具有单调性,即\(L0\)更小不会影响答案,所以二分答案. 假设当前二分的值为\(mid\),将当前的作文放到广义SAM上匹配. 设对于第\ ...

  8. [CTSC2012]熟悉的文章 (后缀自动机 单调队列)

    /* 首先答案显然是具有单调性的, 所以可以二分进行判断 然后当我们二分过后考虑dp来求最长匹配个数, 发现每个点能够转移的地点 肯定是一段区间, 然后这样就能够得到一个log^2算法 至于每个点的匹 ...

  9. [CTSC2012]熟悉的文章 后缀自动机

    题面:洛谷 题解: 观察到L是可二分的,因此我们二分L,然后就只需要想办法判断这个L是否可行即可. 因为要尽量使L可行,因此我们需要求出对于给定L,这个串最多能匹配上多少字符. 如果我们可以对每个位置 ...

随机推荐

  1. postgreSQL安装教程 Windows

    Windows 上安装 PostgreSQL 这里使用 EnterpriseDB 来下载安装,EnterpriseDB 是全球唯一一家提供基于 PostgreSQL 企业级产品与服务的厂商. 下载地址 ...

  2. HTML 表单模板

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. js 回调地狱的另类解决方案尝试

    例如 通过学生获取学生所在学校信息,需要先查询学生所在班级,再通过班级查询所在学校信息.js代码类似写法如下: function getStudentSchool(id) { ajax.get(&qu ...

  4. solo升级以及自动化更新的方法

    使用solo过程总涉及到更新问题,所以就在这里把solo更新的方法总结一下.希望能给小伙伴们一些帮助.如何选择更新方法主要是跟你的部署方式有关,如果你是通过 docker方式进行部署,那么你可以还可以 ...

  5. 网页前端之CSS学习记录总结篇

    标签: 块级标签block:div, p, h1-h6, ul, ol,li, dl, dt, dd,table,tr等,独占一行,可以设置宽高,默认是父标签的100%:行内标签inline:a,sp ...

  6. spanish-1.1

    1.1. ¿Cómo te llamas?Ana : ¿Cómo te llamas?Paco: Buenos dias. Yo soy Paco. Y tú, ¿cómo te llemas?Ana ...

  7. 批量修改含空格的文件名「Linux」

    1.问题:文件批量重命名和处理文件名中的空格 如果文件名中有空格,在执行以下shell脚本的时候会出错. shell 脚本 for filename in `ls` do echo $filename ...

  8. SpringMVC 简单限流方案设计

    一.概念 限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务.排队或等待.降级等处理. 常用的限流算法有两种:漏桶算法和令牌桶算法: ...

  9. 【GUI】基于V7开发板的裸机和各种RTOS版本的emWin程序模板,支持硬件JPEG,已发布(2019-05-26)

    说明: 1.MDK请使用5.26及其以上版本,IAR请使用8.30及其以上版本. 2.修正了ST提供的部分驱动设计不合理的地方. 3.原创实现硬件JPEG添加到emWin中,实现简单,全程使用SDRA ...

  10. 关于 Comparable 的使用

    作为一名刚上路的超初级程序员,今天终于可以迈开自己的第一步,写一篇博客.把我自己都感动哭了. 今天看面试题时看到了一个Comparable 的使用,才发现自己好像并没有使用过这个接口,具体这个接口是怎 ...