偷懒直接把bzoj的网页内容ctrlcv过来了

2806: [Ctsc2012]Cheat

Time Limit: 20 Sec  Memory Limit: 256 MB
Submit: 1943  Solved: 1004
[Submit][Status][Discuss]

Description

Input

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

Output

N行,每行一个整数,表示这篇作文的Lo 值。

Sample Input

1 2
10110
000001110
1011001100

Sample Output

4

HINT

输入文件不超过1100000字节

注意:题目有改动,可识别的长度不小于90%即可,而不是大于90%


所谓少于$1.1*10^6$就是总输入字符数少于这个数...

果然CTSC出的题水平够高

专门爆踩SAM只学了板子不懂各个元素含义和应用的菜鸡(像我这样的就是了)

随便把模式串扔进广义SAM里

答案L0具有单调性

所以二分答案

接下来考虑$O(n)$求出最长匹配长度

$O(n)$的话...只能dp了啊

在SAM上跑字符串匹配求出每一位的最长向前匹配长度$f[i]$

用$dp[i]$表示到i位置匹配了多少字符

之后有dp方程

$dp[i]=max(dp[i-1],max(dp[j=(i-f[i]) to (i-L0)]+i-j))$

对于$dp[j]-j$,$O(n^2)$单调队列优化变成$O(n)$

本题完结

 #include<cstdio>
 #include<cstring>
 #include<queue>
 using std::queue;
 ;
 char sin[N];
 int nn,nm,n;
 template<typename tp>tp max(tp a,tp b){return a>b?a:b;}

 struct sam
 {
     ],len,pre;
 }s[N<<];

 struct Sakuya_Brando
 {
     int size,fin;
     Sakuya_Brando(){size=;}
     void insert(int ch)
     {
         int npx,npy,lpx,lpy;
         if(s[fin].tranc[ch])
         {
             lpx=fin,lpy=s[fin].tranc[ch];
             ) fin=lpy;
             else
             {
                 npy=++size;
                 s[npy]=s[lpy];
                 s[npy].len=s[lpx].len+;
                 s[lpy].pre=npy;
                 while(s[lpx].tranc[ch]==lpy)
                 {
                     s[lpx].tranc[ch]=npy;
                     lpx=s[lpx].pre;
                 }
                 fin=npy;
             }
             return;
         }
         npx=++size;
         s[npx].len=s[fin].len+;
         for(lpx=fin;lpx&&!s[lpx].tranc[ch];lpx=s[lpx].pre) s[lpx].tranc[ch]=npx;
         ;
         else
         {
             lpy=s[lpx].tranc[ch];
             ) s[npx].pre=lpy;
             else
             {
                 npy=++size;
                 s[npy]=s[lpy];
                 s[npy].len=s[lpx].len+;
                 s[lpy].pre=s[npx].pre=npy;
                 while(s[lpx].tranc[ch]==lpy)
                 {
                     s[lpx].tranc[ch]=npy;
                     lpx=s[lpx].pre;
                 }
             }
         }
         fin=npx;
     }
     void ins(char *str,int len)
     {
         fin=;
         len=strlen(str);
         ;i<len;i++) insert(str[i]-');
     }
 }sakuya;

 int f[N];
 int dp[N];
 struct stack
 {
     int v,id;
     stack(){}
     stack(int a,int b){v=a,id=b;}
 }sta[N];
 int he,ta;

 void bao0(char *str,int len)
 {
     ,tmp=;
     ;i<len;i++)
     {
         ';
         if(s[px].tranc[ch]) tmp++,px=s[px].tranc[ch];
         else
         {
             while(px&&!s[px].tranc[ch]) px=s[px].pre;
             ,px=;
             ,px=s[px].tranc[ch];
         }
         f[i]=tmp;
     }
 }
 void noi(char *str,int len)
 {
     ;i<len;i++) f[i]=;
 }
 bool check(char *str,int ll,int len)
 {
     he=,ta=;
     ;
     ;j<len;i++,j++)
     {
         dp[i]=dp[i-];
         while(he<=ta&&sta[he].id<i-f[j]) he++;
         while(he<=ta&&sta[ta].v<=dp[i-ll]-(i-ll)) ta--;
         sta[++ta]=stack(dp[i-ll]-(i-ll),i-ll);
         while(he<=ta&&sta[he].id<i-f[j]) he++;
         if(he<=ta) dp[i]=max(dp[i],i+sta[he].v);
     }
     mxx=dp[len];
     ;i<=len;i++) dp[i]=;
     >=len*) ;
     ;
 }

 int main()
 {
     scanf("%d%d",&nn,&nm);
     ;i<=nm;i++)
     {
         scanf("%s",sin);
         n=strlen(sin);
         sakuya.ins(sin,n);
     }
     ;i<=nn;i++)
     {
         scanf("%s",sin);
         n=strlen(sin);
         bao0(sin,n);
         ,r0=n;
         while(l0<r0)
         {
             )>>;
             if(check(sin,mid,n)) l0=mid;
             ;
         }
         noi(sin,n);
         printf("%d\n",l0);
     }
     ;
 }

[bzoj2806][Ctsc2012]Cheat(后缀自动机(SAM)+二分答案+单调队列优化dp)的更多相关文章

  1. [CTSC2012]熟悉的文章(广义后缀自动机+二分答案+单调队列优化DP)

    我们对作文库建出广义后缀自动机.考虑用\(SAM\)处理出来一个数组\(mx[i]\),表示从作文的第\(i\)个位置向左最远在作文库中出现的子串的长度.这个东西可以在\(SAM\)上跑\(trans ...

  2. P3957 跳房子(二分答案+单调队列优化DP)

    题目链接:https://www.luogu.org/contestnew/show/4468 题目大意:跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则 ...

  3. 洛谷 P3957 跳房子 —— 二分答案+单调队列优化DP

    题目:https://www.luogu.org/problemnew/show/P3957 先二分一个 g,然后判断: 由于转移的范围是一个区间,也就是滑动窗口,所以单调队列优化: 可以先令队尾为 ...

  4. [NOIP2017普及组]跳房子(二分,单调队列优化dp)

    [NOIP2017普及组]跳房子 题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 nn 个格子, ...

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

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

  6. BZOJ_3316_JC loves Mkk_ 二分答案 + 单调队列

    BZOJ_3316_JC loves Mkk_ 二分答案 + 单调队列 题意: 分析: 拆成链,二分答案,奇偶两个单调队列维护最大子段和,记录方案. 代码: #include <cstdio&g ...

  7. 2018.09.26洛谷P3957 跳房子(二分+单调队列优化dp)

    传送门 表示去年考普及组的时候失了智,现在看来并不是很难啊. 直接二分答案然后单调队列优化dp检验就行了. 注意入队和出队的条件. 代码: #include<bits/stdc++.h> ...

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

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

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

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

随机推荐

  1. eclipse集成lombok注解不起作用

    安装步骤: 步骤一:lombok的下载地址为:https://projectlombok.org/download,jar包很小.这里也把依赖写出来: <dependency> <g ...

  2. 项目迁移腾讯云后,用户反馈,https证书不匹配。

    腾讯云大禹高防大禹BGP同一IP绑定多个证书,用户反馈无法匹配我们域名对应证书.但是浏览器是支持的.定位为客户端不支持sni在运维检查lb及高防证书关联无误,定位发现是用户端httpclient没有设 ...

  3. Python机器学习算法 — 关联规则(Apriori、FP-growth)

    关联规则 -- 简介 关联规则挖掘是一种基于规则的机器学习算法,该算法可以在大数据库中发现感兴趣的关系.它的目的是利用一些度量指标来分辨数据库中存在的强规则.也即是说关联规则挖掘是用于知识发现,而非预 ...

  4. [App Store Connect帮助]七、在 App Store 上发行(3.4)提交至“App 审核”:将构建版本从审核中移除

    若要停止“App 审核”流程,您可以将该 App 版本从 App 审核中移除.要执行此项操作,App 状态必须为下列之一: 正在等待出口合规检查 正在等待审核 正在审核 等待开发者发布 等待 Appl ...

  5. VS2010创建C++静态链接库创建和使用

    VS2010创建C++静态链接库的方法: 1. 创建一个新项目,在已安装的模板中选择“常规”,在右边的类型下选择“空项目”,在名称和解决方案名称中输入 staLIB.点击确定. 2.在解决方案资源管理 ...

  6. _bzoj1016 [JSOI2008]最小生成树计数【生成树】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1016 其实原题不叫这个的,而且原题是有一个背景故事的... 首先,容易得知,一个最小生成树不 ...

  7. Spring注解驱动开发之扩展原理

    前言:现今SpringBoot.SpringCloud技术非常火热,作为Spring之上的框架,他们大量使用到了Spring的一些底层注解.原理,比如@Conditional.@Import.@Ena ...

  8. axis2与eclipse的整合:开始一个简单的axis2 的demo

    1.下载axis2,现在axis2最新版本是axis2-1.6.2,下载地址:http://axis.apache.org/axis2/java/core/download.cgi 2.下载好的zip ...

  9. php5.6.30开启redis扩展

    注:5.6版本的php一定要下载phpredis3.0以上的版本,之前自己下载用的2.2.4的redis,安装配置完成后,PHP死活不支持redis的扩展,通过phpinfo打印也压根看不到,重复服务 ...

  10. Android下多彩的StatusView的实现

    概述 在上一个博文 Anroid沉浸式状态栏中提到了,画了一个图,这个图简单将我们的状态栏分为不同的2个维度来看状态栏.其中涉及的概念我不在赘诉,请返到Anroid沉浸式状态栏再去认识下这几个概念.本 ...