Problem

bzoj

题目大意:给定多个标准串和一个文本串,全部为01串,如果一个串长度不少于\(L\)且是任意一个标准串的子串,那么它是“熟悉”的。对于文本串\(A\),把\(A\)分割成若干段子串,其中“熟悉”的子串的长度总和不少于\(A\)总长度的\(90\%\),那么该\(L\)是可行的。求可行的\(L\)最大值

Solution

前置技能:二分答案、SAM、Dp、单调队列

字符串长在L上下对答案贡献是断崖式的,按套路二分L

再根据对序列分段问题的直觉可以得到dp方程:\(f[i]=max(f[i-1],f[j]+i-j),j\leq i-L且s[j…i]是熟悉的\)

这样复杂度加上各种优化是\(O(n^2)\)到\(O(n^3)\)不等的

考虑到对于\(i\),合法的\(j\)一定是连续的,可以用后缀自动机预处理出每一个字符\(i\)向左最长的熟悉的串位置\(orz[i]\)

dp方程为:\(f[i]=\max(f[i-1],f[j]+i-j),j\in[i-orz[i],i-L]\)

发现dp方程可以用单调队列优化:队列里存\(f[i]-i\)即可

Code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rg register const int N=2001000;
int pre[N],stp[N],ch[N][2];
int f[N],q[N],orz[N];
int n,m,len,tot=1,lst=1,L,R;
char s[N]; inline void ins(int x){
int p=lst,np=++tot;
lst=np;stp[np]=stp[p]+1;
while(p&&!ch[p][x])ch[p][x]=np,p=pre[p];
if(!p)pre[np]=1;
else {
int q=ch[p][x];
if(stp[q]==stp[p]+1)pre[np]=q;
else {
int nq=++tot;stp[nq]=stp[p]+1;
//*ch[nq]=*ch[q];
ch[nq][0]=ch[q][0],ch[nq][1]=ch[q][1];
pre[nq]=pre[q];
pre[q]=pre[np]=nq;
while(ch[p][x]==q)ch[p][x]=nq,p=pre[p];
}
}return ;
} inline int check(int li){
int he(1),ta(0);
for(rg int i=1;i<=len;++i){
f[i]=f[i-1];
if(i<li)continue;
while(he<=ta&&f[q[ta]]-q[ta]<=f[i-li]-i+li)--ta;
q[++ta]=i-li;
while(he<=ta&&q[he]<i-orz[i])++he;
if(he<=ta)f[i]=max(f[i],f[q[he]]+i-q[he]);
}return f[len]*10>=len*9;
} void PRE(){
scanf("%s",s+1);
len=strlen(s+1);
L=0;R=len;
int nw(1),cnt(0);
for(rg int i=1;i<=len;++i){
int x=s[i]-'0';
if(ch[nw][x])++cnt,nw=ch[nw][x];
else {
while(nw&&!ch[nw][x])nw=pre[nw];
if(nw)cnt=stp[nw]+1,nw=ch[nw][x];
else nw=1,cnt=0;
}
orz[i]=cnt;
}return ;
} int main(){
scanf("%d%d",&n,&m);
while(m--){
scanf("%s",s);lst=1;
for(rg int i=0;s[i];++i)ins(s[i]-'0');
}
while(n--){
PRE();
while(L<R){
int mid(L+R+1>>1);
if(check(mid))L=mid;
else R=mid-1;
}
printf("%d\n",L);
}return 0;
}

题解-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]熟悉的文章 后缀自动机

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

  6. CTSC2012 熟悉的文章

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

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

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

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

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

  9. Luogu-4022 [CTSC2012]熟悉的文章

    广义后缀自动机+DP 对于作文库建出广义后缀自动机,广义自动机就是在每次添加一个字符串之前把\(last=0\),然后正常添加就好了 对于每个询问串,预处理出每个位置\(i\)能向前匹配的最长长度\( ...

随机推荐

  1. Hadoop记录-hdfs转载

    Hadoop 存档 每个文件均按块存储,每个块的元数据存储在namenode的内存中,因此hadoop存储小文件会非常低效.因为大量的小文件会耗尽namenode中的大部分内存.但注意,存储小文件所需 ...

  2. C#设计模式(0)——设计原则

    设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.在进行设计的时候,我们需要遵循以下几个原则:单一职责原则.开闭原则.里氏替代原则.依赖倒置原则.接口隔离原则 ...

  3. FeignClient调用POST请求时查询参数被丢失的情况分析与处理

    前言 本文没有详细介绍 FeignClient 的知识点,网上有很多优秀的文章介绍了 FeignCient 的知识点,在这里本人就不重复了,只是专注在这个问题点上. 查询参数丢失场景 业务描述: 业务 ...

  4. Linux 三剑客 -- awk sed grep

    本文由本人收集整理自互联网供自己与网友参考,参考文章均已列出,如有侵权,请告知! 顶配awk,中配sed,标配grep awk 参考 sed 参考 grep 参考 在线查看linux命令速记表 app ...

  5. webpack-config.js 内容讲解

    当我们需要和后台分离部署的时候,必须配置config/index.js: 用vue-cli 自动构建的目录里面 (环境变量及其基本变量的配置) var path = require('path') m ...

  6. influxdb

    1.安装Centos# wget https://dl.influxdata.com/influxdb/releases/influxdb-1.1.0.x86_64.rpm# rpm -ivh inf ...

  7. Mysql 的远程设置 和链接方式

    Mysql 设置远程链接: > grant all privileges on *.* to 用户@localhost identified by '密码'; > flush privil ...

  8. transition的属性变化

    链接:https://www.cnblogs.com/yehui-mmd/p/5934157.html css3——transition属性和opacity属性   [transition-durat ...

  9. python 之 configparser 模块

    [root@linag python]# vim config.py import configparser config = configparser.ConfigParser() config[' ...

  10. 使用MiniProfiler检测页面性能

    1.引入nuget包 PM> Install-Package MiniProfiler 2.配置界面 @using StackExchange.Profiling; <head> . ...