题解-CmdOI2019 口头禅
题面
给 \(n\) 个 \(01\) 串 \(s_i\),\(m\) 个询问问 \(s_{l\sim r}\) 的最长公共子串长度。
数据范围:\(1\le n\le 20000\),\(1\le m\le 10^5\),\(\sum |s_i|\le 4\cdot 10^5\)。
蒟蒻语
蒟蒻看到这个题口胡了一个做法,然后轻松拿到了最优解,发现这是道大水题。
什么猫树或分治我没听说过,反正广义 SAM
上枚举子串乱搞 \(\Theta(n\sqrt n\log n)\) 跑得飞快。
蒟蒻解
首先把串建成广义 SAM
没有问题,为了方便我写了盗版的 /ch
。
离线询问,把 \([l_i,r_i]\) 这个询问挂到 \(r_i\) 上。
顺序枚举 \(r\),同时干这些坏事:
把 \(r_i=r\) 的询问按 \(l_i\) 排序,设有 \(qn\) 个询问。
对于 SAM
的节点 \(p\),维护 \(li_p\) 和 \(ri_p\),表示 \(s_{1\sim r}\) 中这个以这个节点为子串的最右连续区间。
维护方法是枚举 \(s_r\) 的所有子串(暴力跳每个前缀的 \(fa\),时间复杂度 \(\Theta(n\sqrt n)\)),通过 \(r-1\) 递推。
然后对于每个该串子串节点 \(p\),lower_bound
找到第一个 \(l_i\ge li_p\),对询问 \([i,qn]\) 的答案都与该节点代表最长串长度取 \(\max\)。
这东西根据单调性差分一下即可,然后就做完了。
代码
#include <bits/stdc++.h>
using namespace std;
//Start
typedef long long ll;
typedef double db;
#define mp(a,b) make_pair((a),(b))
#define x first
#define y second
#define be(a) (a).begin()
#define en(a) (a).end()
#define sz(a) int((a).size())
#define pb(a) push_back(a)
#define R(i,a,b) for(int i=(a),I=(b);i<I;i++)
#define L(i,a,b) for(int i=(b)-1,I=(a)-1;i>I;i--)
const int iinf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;
//Data
const int N=2e4,lN=4e5,qN=1e5;
int n,qn,ans[qN];
string s[N];
vector<pair<int,int>> que[N];
//SuffixAutoMoton
const int tN=(lN<<1)+1,cN=2;
int tn,ch[tN][cN],fa[tN],len[tN];
int newsam(){
fill(ch[tn],ch[tn]+cN,-1),fa[tn]=-1;
return tn++;
}
int rt=newsam(),t;
void extend(int c){
int p=t,np=t=newsam();
len[np]=len[p]+1;
for(;~p&&!~ch[p][c];p=fa[p]) ch[p][c]=np;
if(!~p) fa[np]=rt;
else {
int q=ch[p][c];
if(len[q]==len[p]+1) fa[np]=q;
else {
int nq=newsam();
copy(ch[q],ch[q]+cN,ch[nq]);
len[nq]=len[p]+1,fa[nq]=fa[q],fa[q]=fa[np]=nq;
for(;~p&&ch[p][c]==q;p=fa[p]) ch[p][c]=nq;
}
}
}
int li[tN],ri[tN],vis[tN];
//Main
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>qn;
R(i,0,n){
cin>>s[i],t=rt;
for(char c:s[i]) extend(c-'0');
}
R(i,0,qn){
int l,r; cin>>l>>r,--l,--r;
que[r].pb(mp(l,i));
}
fill(vis,vis+tn,-1);
fill(li,li+tn,-2),fill(ri,ri+tn,-2);
R(i,0,n){
sort(be(que[i]),en(que[i]));
vector<int> mx(sz(que[i])+1);
int p=rt,now=0;
for(char c:s[i]){
int q=p=ch[p][c-'0']; now++;
for(;~q&&vis[q]<i;q=fa[q]){
vis[q]=i;
if(ri[q]==i-1) ri[q]=i;
else li[q]=ri[q]=i;
int id=lower_bound(be(que[i]),en(que[i]),
mp(li[q],-1))-be(que[i]);
mx[id]=max(mx[id],min(len[q],now));
}
}
R(j,0,sz(que[i])) mx[j+1]=max(mx[j+1],mx[j]);
R(j,0,sz(que[i])) ans[que[i][j].y]=mx[j];
}
R(i,0,qn) cout<<ans[i]<<"\n";
return 0;
}
祝大家学习愉快!
题解-CmdOI2019 口头禅的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- 丢了ceph.mon.keying解决办法
在linux操作系统下,可能因为一些很小的误操作,都会造成非常重要的文件的丢失,而文件的备份并不是每时每刻都会注意到,一般是等到文件丢失了才会去想办法,这里讲下ceph.mon.keyring丢失的解 ...
- pytorch框架对RTX 2080Ti RTX 3090的支持与性能测试
时间点:202011-18 一.背景 2020年9月nvidia发布了30系列的显卡.比起20系列网上的评价是:性能翻倍,价格减半. 最近正好本人手上有RTX 2080Ti 和 RTX 3090,所以 ...
- 关于mybatisPlus一些坑,当条件为null时
1.TStaffDepart 属性有值是才匹配条件,会报错,相当于mybatis if 判断 eg:TStaffDepart staffDepart = new TStaffDepart();staf ...
- 没找到Wkhtmltopdf,报表会被显示为html
windows10 odoo 打印报表时提示 没找到Wkhtmltopdf,报表会被显示为html 现象 原因 没有安装Wkhtmltopdf,没有配置环境变量,odoo在电脑系统中找不到Wkhtml ...
- WireShark——ARP 协议包分析
1. 什么是ARP ARP(Address Resolution Protocol)协议,即地址解析协议.该协议的功能就是将 IP 地 址解析成 MAC 地址. ARP(Address Resolu ...
- SAP PI接口ESR IA配置,几种常用的 XSL 转换文档模板
在PI开发配置中字段映射一般分为Message Mapping(MM)和Imported Archives(IA)这两种形式.MM这种拉线的形式虽然看似方便,但是当接口更新和传输时往往比较麻烦,同时无 ...
- FL Studio杂项设置页讲解(下)
上篇文章中我们重点讲解了FL Studio中"截断/被截"如何有效的避免个采样在播放时相互干扰的知识以及电平设置栏的知识,今天我们将讲完该页面中剩下的栏目知识,一起来看看吧! 1. ...
- 会声会影使用教程:剪辑Vlogo短视频
随着抖音.快手等视频分享软件的兴起,很多人已经开始尝试制作短视频分享.那么,对于视频制作新手来说,短视频的制作难度大吗?其实,只要选对了视频制作软件,视频制作将会变得相当简单. 在众多视频制作软件中, ...
- 如何查看CDR文件是出自哪个版本?
如何才能知道某个cdr文件用哪个版本的CorelDRAW软件打开?网上CorelDRAW软件有很多版本,都不知该下哪个了?这是我听到大家问道最多的问题,这是因为CDR低版本软件打不开高版本文件. 方法 ...
- python应用(1):安装与使用
程序员的基本工作是写程序,而写程序要用到编程语言,编程语言可以分为编译型语言跟解释型语言. 编译型语言,就是在执行代码之前,先把源代码编译(加链接)成另一种形式的代码,比如目标代码,或字节码,这种代码 ...