BZOJ 2806: [Ctsc2012]Cheat [广义后缀自动机 单调队列优化DP 二分]
2806: [Ctsc2012]Cheat
题意:
多个主串和多个询问串,每次询问将询问串分成多个连续子串,如果一个子串长度>=L且在主串中出现过就是熟悉的
如果熟悉的字符串长度>=询问串长的90%就是熟悉的文章;求成为熟悉的文章的最大的L
主串建广义SAM然后二分L判断可行性
使用DP判断L是否可行,一定要注意是长度不是数量,煞笔Candy?就看错题了
len[i]表示i位置之前最大公共长度,和spoj LCS一样...
f[i]表示前i个字符最长熟悉长度,f[i]=max{f[i-1],f[j]+j-i|i-len[i]<=j<=i-L},显然i-len[i]不严格递增,使用单调队列优化到O(n)
DP注意:
1.f[i-1]这个转移
2.判断条件i-L<0说明没有转移;0也是一个转移!!但不能一开始先把0加入队列WA了好多次
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int N=1e6+;
typedef long long ll;
int n,m;
char s[N];
struct node{
int ch[],par,val;
}t[N];
int sz=,root=,last=;
void extend(int c){
int p=last,np=++sz;
t[np].val=t[p].val+;
for(;p&&!t[p].ch[c];p=t[p].par) t[p].ch[c]=np;
if(!p) t[np].par=root;
else{
int q=t[p].ch[c];
if(t[q].val==t[p].val+) t[np].par=q;
else{
int nq=++sz;
t[nq]=t[q];t[nq].val=t[p].val+;
t[q].par=t[np].par=nq;
for(;p&&t[p].ch[c]==q;p=t[p].par) t[p].ch[c]=nq;
}
}
last=np;
}
int len[N],f[N];
void getLen(){
int u=root,sum=;
for(int i=;i<=n;i++){
int c=s[i]-'';
if(t[u].ch[c]) u=t[u].ch[c],sum++;
else{
while(u&&!t[u].ch[c]) u=t[u].par;
if(!u) u=root,sum=;
else sum=t[u].val+,u=t[u].ch[c];
}
len[i]=sum;//printf("len %d %d\n",i,len[i]);
}
}
int q[N],head,tail;
bool check(int L){//printf("L %d\n",L);
head=;tail=;
for(register int i=;i<=n;i++){
f[i]=f[i-];
if(i-L<) continue;
while(head<=tail&&f[q[tail]]-q[tail]<f[i-L]-i+L) tail--;
q[++tail]=i-L;
while(head<=tail&&q[head]<i-len[i]) head++;
if(head<=tail) f[i]=max(f[i],f[q[head]]+i-q[head]);
//printf("f %d %d\n",i,f[i]);
}
//printf("f %d %d\n",n,f[n]);
return f[n]*>=n*;
}
void solve(){
getLen();
int l=,r=n,ans=;
while(l<=r){
int mid=(l&r)+((l^r)>>);
if(check(mid)) ans=mid,l=mid+;
else r=mid-;
}
printf("%d\n",ans);
}
int main(){
freopen("in","r",stdin);
scanf("%d%d",&m,&n);
for(int i=;i<=n;i++){
scanf("%s",s+);
int len=strlen(s+);
last=root;
for(int j=;j<=len;j++) extend(s[j]-'');
}
for(int i=;i<=m;i++){
scanf("%s",s+);
n=strlen(s+);
solve();
}
}
BZOJ 2806: [Ctsc2012]Cheat [广义后缀自动机 单调队列优化DP 二分]的更多相关文章
- bzoj 2806 [Ctsc2012]Cheat——广义后缀自动机+单调队列优化DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2806 只想着怎么用后缀数据结构做,其实应该考虑结合其他算法. 可以二分那个长度 L .设当前 ...
- 【BZOJ2806】【CTSC2012】Cheat - 广义后缀自动机+单调队列优化DP
题意: Description Input 第一行两个整数N,M表示待检查的作文数量,和小强的标准作文库的行数 接下来M行的01串,表示标准作文库 接下来N行的01串,表示N篇作文 Output N行 ...
- 【BZOJ2806】Cheat 【广义后缀自动机+单调队列优化dp+二分】
题意 有M篇标准作文组成了一个作文库(每篇作文都是一个01的字符串),然后给出N篇作文(自然也是01字符串).如果一个长度不小于L的串在作文库中出现过,那么它是熟悉的.对于某一篇作文,我们要把它分为若 ...
- BZOJ.2806.[CTSC2012]Cheat(广义后缀自动机 DP 单调队列)
题目链接 首先二分答案L.然后就是判断能否将原串划分出一些长度不小于L的子串,这些子串要是给定n个串中的某个串的子串,且满足它们的长度之和不小于原串长度的90%. 贪心多长选一段什么的显然不对.老老实 ...
- BZOJ 2806 [Ctsc2012]Cheat ——后缀自动机 单调队列优化DP
先建出广义后缀自动机. 然后跑出文章中每一个位置的最大匹配距离. 然后定义$f[i]$表示匹配到以$i$结尾的串时,最长的匹配距离. 显然可以二分$L$的取值. 然后容易得到$DP$方程 $f[i]= ...
- BZOJ 2806 Luogu P4022 [CTSC2012]Cheat (广义后缀自动机、DP、二分、单调队列)
题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=2806 (luogu) https://www.luogu.org/pro ...
- BZOJ 2442 [Usaco2011 Open]修剪草坪:单调队列优化dp
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2442 题意: 有n个数a[i]从左到右排成一排. 你可以任意选数,但是连续的数不能超过k个 ...
- 【BZOJ2806】[Ctsc2012]Cheat 广义后缀自动机+二分+单调队列优化DP
[BZOJ2806][Ctsc2012]Cheat Description Input 第一行两个整数N,M表示待检查的作文数量,和小强的标准作文库的行数接下来M行的01串,表示标准作文库接下来N行的 ...
- BZOJ 1499 [NOI2005] 瑰丽华尔兹 | 单调队列优化DP
BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜 ...
随机推荐
- 使用vue-axios请求geoJson数据报错的问题
最近的项目用到了echarts一个带有散点地图的图表,按照正常jquery写法应该使用ajax请求geojson的数据动态去切换地图,就像下面这样 $.get('Js/map/' + cityData ...
- .28-浅析webpack源码之compiler.resolvers
原本该在过WebpackOptionsApply时讲解这个方法的,但是当时一不小心过掉了,所以在这里补上. compiler.resolvers 该对象的三个方法均在WebpackOptionsApp ...
- mysql中的union和order by、limit
我有一个表 CREATE TABLE `test1` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(20) N ...
- curl说明
https://baike.baidu.com/item/curl/10098606?fr=aladdin curl是利用URL语法在命令行方式下工作的开源文件传输工具.它被广泛应用在Unix.多种L ...
- J.U.C CAS
在JDK1.5之前,也就是J.U.C加入JDK之前,Java是依靠synchronized关键字(JVM底层提供)来维护协调对共享字段的访问,保证对这些变量的独占访问权,并且以后其他线程忽的该锁时,将 ...
- mysql查询语句处理
两表做链接查询, 查理处理顺序各个阶段: 1) From: 对From子句中的坐标<left_table>和右表<right_table>执行笛卡尔积,产生虚拟表T1: 2 ...
- Java数据持久层框架 MyBatis之API学习七(动态 SQL详解)
对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...
- Web Magic 简介
WebMagic in Action Little book of WebMagic. WebMagic是我业余开发的一款简单灵活的爬虫框架.基于它你可以很容易的编写一个爬虫. 这本小书以WebMag ...
- Servlet开篇
Servlet开篇 前面我已经说过好多遍了,如何学习好一个东西其实就是2个问题: 1,这个东西是干嘛的?为什么要玩这个东西? 2,怎么样就玩好这个东西了?具体的应该玩这个东西的什么? 其实现在对于我来 ...
- linkin大话设计模式--常用模式总结
linkin大话设计模式--常用模式总结 一,常用设计模式定义 Abstract Factory(抽象工厂模式):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. Adapter( ...