[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且在主串中出现过就是熟悉的 如果熟悉的字符串长度>=询问串 ...
随机推荐
- winform 窗体设置成无边框、可拖拽、四周圆角
最近做一个及时通讯系统的登录界面,现在将界面用到的无边框.可拖拽.四周圆角的方法分享如下: 1.无边框的窗体: 把FormBorderStyle的属性设置为none 2.可拖拽:private Poi ...
- Mysql数据库基础操作
Mysql数据库基础操作 在mysql数据库中开启使用tab键补全功能 1)修改主配置文件/etc/mysql/my.cnf(mysql和mariadb目录有些不同) vim /etc/mysql/m ...
- sql server 变量 字符串拼接
参考:SQL server中null+字符串,isnull以及把查询结果赋给一个字符变量组成另一个查询语句 1.开始定义的字符串都为null.例如:declare @sql,那么@sql就是null ...
- appium封装显示等待Wait类和ExpectedCondition接口
此文已由作者夏鹏授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 使用WebDriver做Web自动化的时候,org.openqa.selenium.support.ui中提供 ...
- Activiti6.0教程 28张表解析 (三)
使用Activit的朋友都知道Activiti对应的有28张表,今天我们就来说下Activit中28张表对应的含义是什么? 如何创建表? 在Activiti中创建表有三种方式,我们依次来看下: 一.通 ...
- 进击的Python【第七章】:python各种类,反射,异常处理和socket基础
Python的高级应用(三)面向对象编程进阶 本章学习要点: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 一.面向对象高级语法部分 静态方法 ...
- 牛客网暑期ACM多校训练营(第五场)
J-plan(贪心) 题目描述 There are n students going to travel. And hotel has two types room:double room and t ...
- 题解报告:poj 1195 Mobile phones(二维BIT裸题)
Description Suppose that the fourth generation mobile phone base stations in the Tampere area operat ...
- ACM_求N^N的最高位数
Leftmost Digit Time Limit: 2000/1000ms (Java/Others) Problem Description: 给定一个正整数N,你应该输出N ^ N的最左边的数字 ...
- CalService
package org.crazyit.cal; import java.math.BigDecimal; /** * 计算业务类 * * @author yangenxiong yangenxion ...