[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
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且在主串中出现过就是熟悉的 如果熟悉的字符串长度>=询问串 ...
随机推荐
- nodejs--JWT 在前后端分离中的应用与实践
nodejs--JWT 在前后端分离中的应用与实践 http://www.cnblogs.com/lidongyue/p/5269695.html
- OKEX websocket API 连接Python范例
因为 websocket-client 新版的各种大脑降级设计 很多功能无法使用需要安装老版本websocket-client的包才能正常使用 pip3 install websocket-clien ...
- Windows服务使用log4net记录日志
该文章是系列文章 基于.NetCore和ABP框架如何让Windows服务执行Quartz定时作业 的其中一篇. 比较流行的日志组件有以下四种,Topshelf都有相应的组件提供 log4net NL ...
- 各个nginx conf的虚拟主机的配置
server { listen 80; server_name t-cl.orangevip.com; rewrite ^(.*)$ https://$host$1 permanent;} serve ...
- LoadRunner_11破解教程完整版
2017.12.17更正 qtm的LR11,如果是win10版本的电脑而且ie浏览器是11以上的请到loadrunner官网下载社区免费版,支持google,firefox,edge,ie11四大浏览 ...
- 关于cocoapods安装与使用的总结
昨天晚上研究了很入的cocoapods,在各大论坛也看过了很多方法,这里把之前的方法做一个总结. 这里我把自己遇到的一些问题,大概的说了一下.也让广告初学者少走弯路. 先是来自code4app的文章: ...
- [转]Asp.net Mvc2中重构View的三种方式
本文转自:http://www.cnblogs.com/zhuqil/archive/2010/07/14/asp-net-mvc2-view-refactoring.html 我们在Asp.net ...
- ASP.NET Core MVC使用MessagePack配合前端fetch交换数据
1.安装Nuget包 - WebApiContrib.Core.Formatter.MessagePack https://www.nuget.org/packages/WebApiContrib.C ...
- A8通用权限框架
- div里面整齐的字体样式,所有浏览器都兼容
<div id="wenda"> <div class="table_wd" > <div class="tr1&quo ...