[bzoj2806][Ctsc2012]Cheat(后缀自动机(SAM)+二分答案+单调队列优化dp)
偷懒直接把bzoj的网页内容ctrlcv过来了
2806: [Ctsc2012]Cheat
Time Limit: 20 Sec Memory Limit: 256 MB
Submit: 1943 Solved: 1004
[Submit][Status][Discuss]
Description
.jpg)
.jpg)
Input
第一行两个整数N,M表示待检查的作文数量,和小强的标准作文库
的行数
接下来M行的01串,表示标准作文库
接下来N行的01串,表示N篇作文
Output
N行,每行一个整数,表示这篇作文的Lo 值。
Sample Input
10110
000001110
1011001100
Sample Output
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)的更多相关文章
- [CTSC2012]熟悉的文章(广义后缀自动机+二分答案+单调队列优化DP)
我们对作文库建出广义后缀自动机.考虑用\(SAM\)处理出来一个数组\(mx[i]\),表示从作文的第\(i\)个位置向左最远在作文库中出现的子串的长度.这个东西可以在\(SAM\)上跑\(trans ...
- P3957 跳房子(二分答案+单调队列优化DP)
题目链接:https://www.luogu.org/contestnew/show/4468 题目大意:跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则 ...
- 洛谷 P3957 跳房子 —— 二分答案+单调队列优化DP
题目:https://www.luogu.org/problemnew/show/P3957 先二分一个 g,然后判断: 由于转移的范围是一个区间,也就是滑动窗口,所以单调队列优化: 可以先令队尾为 ...
- [NOIP2017普及组]跳房子(二分,单调队列优化dp)
[NOIP2017普及组]跳房子 题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 nn 个格子, ...
- 【BZOJ2806】Cheat(后缀自动机,二分答案,动态规划,单调队列)
[BZOJ2806]Cheat(后缀自动机,二分答案,动态规划,单调队列) 题面 BZOJ 洛谷 题解 很有趣的一道题啊 对于在所有的串上面进行匹配? 很明显的后缀自动机 所以先构建出广义后缀自动机 ...
- BZOJ_3316_JC loves Mkk_ 二分答案 + 单调队列
BZOJ_3316_JC loves Mkk_ 二分答案 + 单调队列 题意: 分析: 拆成链,二分答案,奇偶两个单调队列维护最大子段和,记录方案. 代码: #include <cstdio&g ...
- 2018.09.26洛谷P3957 跳房子(二分+单调队列优化dp)
传送门 表示去年考普及组的时候失了智,现在看来并不是很难啊. 直接二分答案然后单调队列优化dp检验就行了. 注意入队和出队的条件. 代码: #include<bits/stdc++.h> ...
- BZOJ2806 [Ctsc2012]Cheat 【后缀自动机 + 二分 + 单调队列优化DP】
题目 输入格式 第一行两个整数N,M表示待检查的作文数量,和小强的标准作文库 的行数 接下来M行的01串,表示标准作文库 接下来N行的01串,表示N篇作文 输出格式 N行,每行一个整数,表示这篇作文的 ...
- BZOJ 2806: [Ctsc2012]Cheat [广义后缀自动机 单调队列优化DP 二分]
2806: [Ctsc2012]Cheat 题意: 多个主串和多个询问串,每次询问将询问串分成多个连续子串,如果一个子串长度>=L且在主串中出现过就是熟悉的 如果熟悉的字符串长度>=询问串 ...
随机推荐
- js调用的注意项
注意将js代码写在调用的前面 这样他就知道了 自己所调用的函数是什么了
- 关于kindle无法连接上wifi的问题
家里换了宽带以后我发现kindle无法链接上WiFi了. 原因可能是我家使用的WiFi网络是1-11之间的信道,也有可能是运营商的问题(由于我是软件开发,对硬件和网络并不是很清楚,只能大概估计一下). ...
- 洛谷P4116 Qtree3(树剖+线段树)
传送门 LCT秒天秒地 树剖比较裸的题了 用线段树记录一下区间的最左边的黑点的编号(因为同一条链上肯定是最左边的深度最小,到根节点距离最近) 然后记得树剖的时候肯定是越后面的答案越优,因为深度越浅 / ...
- 【数据结构】27、红黑树,节点插入,修复平衡操作总结(针对jdk8中hashmap冲突过多链表转红黑树)
二叉树节点插入 0.如果只有一个节点,那么就直接作为根,涂黑,如果父为黑,或者祖父为空,那么不做操作 1.叔叔节点不为空且为红 那么就修改父,叔叔,祖父节点颜色,最后把当前节点设置为祖父节点,在进行平 ...
- [POI2007]四进制的天平Wag
Description Mary准备举办一个聚会,她准备邀请很多的人参加她的聚会.并且她准备给每位来宾准备一些金子作为礼物.为了不伤及每个人的脸面,每个人获得的金子必须相同.Mary将要用一个天平来称 ...
- 尺取法 POJ 3601 Subsequence
题目传送门 /* 题意:求连续子序列的和不小于s的长度的最小值 尺取法:对数组保存一组下标(起点,终点),使用两端点得到答案 1. 记录前i项的总和,求[i, p)长度的最小值,用二分找到sum[p] ...
- 题解报告:hdu 1257 最少拦截系统(贪心)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1257 Problem Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是 ...
- Spring配置文件中未引入dubbo命名空间头部配置而引起的错误案例
问题描述: Spring配置文件中未引入dubbo命名空间的头部配置而引起项目启动时报出如下错误信息: org.springframework.beans.factory.xml.XmlBeanDef ...
- 灰度世界算法(Gray World Algorithm) 分类: 图像处理 Matlab 2014-12-07 18:40 874人阅读 评论(0) 收藏
人的视觉系统具有颜色恒常性,能从变化的光照环境和成像条件下获取物体表面颜色的不变特性,但成像设备不具有这样的调节功能, 不同的光照环境会导致采集的图像颜色与真实颜色存在一定程度的偏差,需要选择合适的颜 ...
- JavaScript的执行
下面内容参考:http://blog.csdn.net/cxiaokai/article/details/7552653 http://www.jb51.net/article/36755.htm 首 ...