bzoj 2806: [Ctsc2012]Cheat
好久没刷bzoj惹……
题意不说可以嘛。
首先二分答案。
SAM的事情搞完以后就是dp辣。
我们已经对于每个位置i,找到了最小的一个k,使得[k,i]这个子串在模版串中出现过。那么我们需要做的是把f[i]给min上f[k]到f[i-x],直接搞是$n^2logn$的,套个数据结构也是两个log的。然而如果一个位置j不在合法的区间中,那么以后也不会进入,那么直接用一个单调队列维护就好了。
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #define MN 1200000
- using namespace std;
- int read_p,read_ca,read_f;
- inline int read(){
- read_p=;read_ca=getchar();read_f=;
- while(read_ca<''||read_ca>'') read_f=read_ca=='-'?-:read_f,read_ca=getchar();
- while(read_ca>=''&&read_ca<='') read_p=read_p*+read_ca-,read_ca=getchar();
- return read_p*read_f;
- }
- struct na{int l,f,t[];na(){t[]=t[]=;f=-;}}t[MN<<];
- int n,m,la,num=,mi[MN],st[MN];
- char s[MN];
- inline void add(int x){
- int p=++num;t[p].l=t[la].l+;
- while (la!=-&&!t[la].t[x]) t[la].t[x]=p,la=t[la].f;
- if (la==-) t[p].f=;else{
- int o=t[la].t[x];
- if (t[o].l==t[la].l+) t[p].f=o;else{
- int np=++num;
- t[np]=t[o];
- t[np].l=t[la].l+;
- t[o].f=t[p].f=np;
- while (la!=-&&t[la].t[x]==o) t[la].t[x]=np,la=t[la].f;
- }
- }
- la=p;
- }
- inline bool ju(int x){
- mi[]=;
- int i,p,l,L=,R=;
- for (i=;s[i-];i++) mi[i]=1e9;
- for (i=,p=,l=;s[i];i++){
- while (p&&!t[p].t[s[i]-'']) p=t[p].f,l=t[p].l;
- if (t[p].t[s[i]-'']) p=t[p].t[s[i]-''],l++;
- if (i+>=x){
- while(L<=R&&mi[i+-x]<=mi[st[R]]) R--;
- st[++R]=i+-x;
- }
- while (L<=R&&st[L]<=i-l) L++;
- if (L<=R) if (mi[i+]>mi[st[L]]) mi[i+]=mi[st[L]];
- if (mi[i+]>mi[i]+) mi[i+]=mi[i]+;
- }
- return mi[i]*<=i;
- }
- int main(){
- n=read();m=read();
- for (int i=;i<=m;i++){
- la=;scanf("%s",s);
- for (int j=;s[j];j++) add(s[j]-'');
- }
- for (int i=;i<=n;i++){
- scanf("%s",s);
- int l=,r=strlen(s),mid;
- while(l<r) if (ju(mid=l+r+>>)) l=mid;else r=mid-;
- printf("%d\n",l);
- }
- }
bzoj 2806: [Ctsc2012]Cheat的更多相关文章
- bzoj 2806: [Ctsc2012]Cheat 后缀自动机DP
2806: [Ctsc2012]Cheat Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 583 Solved: 330[Submit][Statu ...
- BZOJ 2806: [Ctsc2012]Cheat [广义后缀自动机 单调队列优化DP 二分]
2806: [Ctsc2012]Cheat 题意: 多个主串和多个询问串,每次询问将询问串分成多个连续子串,如果一个子串长度>=L且在主串中出现过就是熟悉的 如果熟悉的字符串长度>=询问串 ...
- bzoj 2806 [Ctsc2012]Cheat——广义后缀自动机+单调队列优化DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2806 只想着怎么用后缀数据结构做,其实应该考虑结合其他算法. 可以二分那个长度 L .设当前 ...
- BZOJ.2806.[CTSC2012]Cheat(广义后缀自动机 DP 单调队列)
题目链接 首先二分答案L.然后就是判断能否将原串划分出一些长度不小于L的子串,这些子串要是给定n个串中的某个串的子串,且满足它们的长度之和不小于原串长度的90%. 贪心多长选一段什么的显然不对.老老实 ...
- BZOJ 2806 [Ctsc2012]Cheat ——后缀自动机 单调队列优化DP
先建出广义后缀自动机. 然后跑出文章中每一个位置的最大匹配距离. 然后定义$f[i]$表示匹配到以$i$结尾的串时,最长的匹配距离. 显然可以二分$L$的取值. 然后容易得到$DP$方程 $f[i]= ...
- bzoj 2806: [Ctsc2012]Cheat【广义SAM+二分+dp+单调队列】
把模板串建一个广义SAM 然后在线查询,每次在SAM上预处理出一个a[i]表示i位置向前最多能匹配多长的模板串 二分答案L,dp判断,设f[i]为·~i有几个匹配,转移显然是f[i]=max{f[i- ...
- BZOJ 2806 [Ctsc2012]Cheat (后缀自动机+二分+单调队列+dp)
题目大意: 给你一堆模式串和文本串 对于每个文本串,我们可以把它不可重叠地拆分成很多子串,如果拆分出的串作为子串出现在了任何一个模式串中,我们称它是“眼熟的”,我们必须保证“眼熟的”子串总长度不小于文 ...
- BZOJ 2806: [Ctsc2012]Cheat(单调队列优化dp+后缀自动机)
传送门 解题思路 肯定先要建出来广义后缀自动机.刚开始以为是个二分+贪心,写了一下结果\(20\)分.说一下正解,首先显然\(L_0\)具有单调性,是可以二分的.考虑二分后怎样判合法,对于分割序列很容 ...
- 【BZOJ 2806】 2806: [Ctsc2012]Cheat (SAM+二分+DP+单调队列)
2806: [Ctsc2012]Cheat Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1262 Solved: 643 Description ...
随机推荐
- ABP .Net Core API和Angular前端APP集成部署
前言:在ABP官网(https://aspnetboilerplate.com)生成的.Net Core + Angular项目前后端是两个独立的项目,我们可以分开部署,也可以将前端和Web API一 ...
- [数据结构]C语言栈的实现
有始有终,所以我准备把各种数据结构都讲一次,栈也分顺序存储和链式储存,这里我们选择链式存储来讲,顺序存储没有难度(链式其实也是) 作为数据结构中最简单的栈,这里不会说太多,首先考虑一下下面的model ...
- Python的文件及异常
1. Python的文件及异常 1.1 文件操作 1.1.1 从文件中读取数据 许多情况下,我们的信息是存储在文本中的.例如对用户行为的分析,用户访问系统或者网站的访问信息会被存储于文本中,然后对文本 ...
- js跳转页面的几种方式
第一种: window.location.href="http://www.baidu.com"; 第二种: window.history.back(-1); 第三种: windo ...
- Webpack 2 视频教程 009 - 配置 ESLint 实现代码规范自动测试 (上)
原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...
- docker 保存 加载(导入 导出镜像
tensorflow 的docker镜像很大,pull一次由于墙经常失败.其实docker 可以将镜像导出再导入. 保存加载(tensorflow)镜像 1) 查看镜像 docker images 如 ...
- 利用伪元素:after清除浮动
一.代码 html代码 <div class="clearfix"></div> css样式 .clearfix{ zoom:1;/*这个属性是为了兼容IE ...
- Maven项目不打包*.hbm.xml文件
<build> <finalName>basic</finalName> <plugins> <plugin> <groupId> ...
- PHP生成验证码
<?php check_code(); function check_code($width = 100, $height = 50, $num = 4, $type = 'jpeg') { $ ...
- [Android游戏开发]八款开源 Android 游戏引擎 (巨好的资源)
初学Android游戏开发的朋友,往往会显得有些无所适从,他们常常不知道该从何处入手,每当遇到自己无法解决的难题时,又往往会一边羡慕于 iPhone下有诸如Cocos2d-iphone之类的免费游戏引 ...