[BZOJ4556][Tjoi2016&Heoi2016]字符串 主席树+二分+倍增+后缀自动机
4556: [Tjoi2016&Heoi2016]字符串
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 1215 Solved: 484
[Submit][Status][Discuss]
Description
Input
Output
对于每一次询问,输出答案。
Sample Input
aaaaa
1 1 1 5
1 5 1 1
2 3 2 3
2 4 2 3
2 3 2 4
Sample Output
1
2
2
2
HINT
Source
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstdio>
#define maxn 200010
using namespace std;
int n,m;
struct data {
int last,cnt;
int link[maxn],step[maxn],son[maxn][];
int v[maxn],pos[maxn],fa[maxn][],w[maxn];
int s[maxn*][],rt[maxn],t;
void insert(int &k,int l,int r,int x) {
k=++t;
if(l==r) return;
int mid=l+r>>;
if(x<=mid) insert(s[k][],l,mid,x);
else insert(s[k][],mid+,r,x);
}
int merge(int x,int y) {
if(!x||!y) return x+y;
int z=++t;
s[z][]=merge(s[x][],s[y][]);s[z][]=merge(s[x][],s[y][]);
return z;
}
bool query(int x,int l,int r,int L,int R) {
if(!x) return ;
if(L<=l&&R>=r) return ;
int mid=l+r>>;
if (R<=mid) return query(s[x][],l,mid,L,R);
else if(L>mid) return query(s[x][],mid+,r,L,R);
else return query(s[x][],l,mid,L,mid)||query(s[x][],mid+,r,mid+,R);
}
data() {last=cnt=;}
void extend(int x,int id) {
int p=last,np=last=++cnt;step[np]=step[p]+;insert(rt[np],,n,id);w[id]=np;
while(p&&!son[p][x]) son[p][x]=np,p=link[p];
if(!p) link[np]=;
else {
int q=son[p][x];
if(step[q]==step[p]+) link[np]=q;
else {
int nq=++cnt;
memcpy(son[nq],son[q],sizeof(son[q]));
link[nq]=link[q];
link[q]=link[np]=nq;
step[nq]=step[p]+;
while(p&&son[p][x]==q) son[p][x]=nq,p=link[p];
}
}
}
void pre() {
for(int i=;i<=cnt;i++) v[step[i]]++;
for(int i=;i<=cnt;i++) v[i]+=v[i-];
for(int i=cnt;i;i--) pos[v[step[i]]--]=i;
for(int i=cnt;i;i--) {
rt[link[pos[i]]]=merge(rt[link[pos[i]]],rt[pos[i]]);
fa[pos[i]][]=link[pos[i]];
}
for(int j=;j<=;j++) for(int i=;i<=cnt;i++) fa[i][j]=fa[fa[i][j-]][j-];
}
bool check(int mid,int x,int l,int r) {
for(int i=;i>=;i--) if(step[fa[x][i]]>=mid) x=fa[x][i];
return query(rt[x],,n,l,r);
}
}a;
char ch[maxn];
int main() {
scanf("%d%d",&n,&m);
scanf("%s",ch+);reverse(ch+,ch+n+);
for(int i=;i<=n;i++) a.extend(ch[i]-'a',i);
a.pre();
for(int i=;i<=m;i++) {
int a1,b1,c1,d1;scanf("%d%d%d%d",&a1,&b1,&c1,&d1);
a1=n-a1+;b1=n-b1+;c1=n-c1+;d1=n-d1+;
swap(a1,b1);swap(c1,d1);
int l=,r=min(d1-c1+,b1-a1+);
while(l<=r) {
int mid=l+r>>;
if(a.check(mid,a.w[d1],a1+mid-,b1)) l=mid+;
else r=mid-;
}
printf("%d\n",l-);
}
}
[BZOJ4556][Tjoi2016&Heoi2016]字符串 主席树+二分+倍增+后缀自动机的更多相关文章
- [BZOJ4556][TJOI2016&&HEOI2016]字符串(二分答案+后缀数组+RMQ+主席树)
4556: [Tjoi2016&Heoi2016]字符串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1360 Solved: 545[S ...
- [BZOJ4556][Tjoi2016&Heoi2016]字符串 后缀数组+主席树
4556: [Tjoi2016&Heoi2016]字符串 Time Limit: 20 Sec Memory Limit: 128 MB Description 佳媛姐姐过生日的时候,她的小 ...
- Bzoj4556: [Tjoi2016&Heoi2016]字符串 后缀数组
4556: [Tjoi2016&Heoi2016]字符串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 169 Solved: 87[Sub ...
- CF547E Milk and Friends(AC自动机的fail指针上建主席树 或 广义后缀自动机的parent线段树合并)
What-The-Fatherland is a strange country! All phone numbers there are strings consisting of lowercas ...
- BZOJ4556 [Tjoi2016&Heoi2016]字符串 SA ST表 二分答案 主席树
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ4556.html 题目传送门 - BZOJ4556 题意 给定一个长度为 $n$ 的字符串 $s$ . ...
- BZOJ4556 [Tjoi2016&Heoi2016]字符串 【后缀数组 + 主席树 + 二分 + ST表】
题目 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了 一个长为n的字符串s,和m个问题.佳媛姐姐必须正确回答这m个问题,才能打开箱子拿到礼物,升职 ...
- bzoj4556: [Tjoi2016&Heoi2016]字符串 (后缀数组加主席树)
题目是给出一个字符串,每次询问一个区间[a,b]中所有的子串和另一个区间[c,d]的lcp最大值,首先求出后缀数组,对于lcp的最大值肯定是rank[c]的前驱和后继,但是对于这个题会出现问题,就是题 ...
- BZOJ4556: [Tjoi2016&Heoi2016]字符串
Description 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了 一个长为n的字符串s,和m个问题.佳媛姐姐必须正确回答这m个问题,才能打开 ...
- 2019.02.27 bzoj4556: [Tjoi2016&Heoi2016]字符串(二分答案+sam+线段树合并)
传送门 题意:给一个字符串SSS. 有mmm次询问,每次给四个参数a,b,c,da,b,c,da,b,c,d,问s[a...b]s[a...b]s[a...b]的所有子串和s[x...y]s[x... ...
随机推荐
- OpenCV彩色图像转灰度图
核心函数cvSplit(). #include<cv.h> #include<highgui.h> int main(int argc, char** argv) { IplI ...
- java线程(3)——详解Callable、Future和FutureTask
回顾: 接上篇博客 java线程--三种创建线程的方式,这篇博客主要介绍第三种方式Callable和Future.比较继承Thread类和实现Runnable接口,接口更加灵活,使用更广泛.但这两种方 ...
- javaScript this 之谜
作为接触js没多久的人对变量作用域和this所指表示非常迷惑,专门花了一个下午google了一下,感觉以前百度到的结果都是什么鬼... 下面是我对this的认识,学疏才浅请拍砖 每一个方法都有自己的上 ...
- 在.cs代码文件中无法识别控件
原因:由于直接复制别人的网页文件到项目. 解决方案,自己右键,新建网页,再把控件代码复制到 aspx和 cs
- BZOJ1558 [JSOI2009]等差数列 【线段树】
题目链接 BZOJ1558 题解 等差数列,当然是差分一下 差分值相同的连续位置形成等差数列,我们所选的两个等差数列之间可以有一个位置舍弃 例如: \(1 \; 2 \; 3 \; 6 \; 8 \; ...
- BZOJ2337: [HNOI2011]XOR和路径 期望概率dp 高斯
这个题让我认识到我以往对于图上期望概率的认识是不完整的,我之前只知道正着退还硬生生的AC做过的所有图,那么现在让我来说一下逆退,一般来说对于概率性的东西都只是正推,因为有了他爸爸才有了他,而对于期望性 ...
- More on understanding sort_buffer_size
There have been a few posts by Sheeri and Baron today on the MySQL sort_buffer_size variable. I want ...
- hadoop之HDFS与MapReduce
Hadoop历史 雏形开始于2002年的Apache的Nutch,Nutch是一个开源Java 实现的搜索引擎.它提供了我们运行自己的搜索引擎所需的全部工具.包括全文搜索和Web爬虫. 随后在2003 ...
- java md5加密 不依赖base64包
/** * MD5 加密 */ private String getMD5Str(String str) { MessageDigest messageDigest = null; try { mes ...
- JS遮罩层弹框效果
对于前端开发者来说,js是不可缺少的语言.现在我开始把我日常积累的一些js效果或者通过搜索自己总结的一些效果分享给大家,希望能够帮助大家一起进步,也希望大家能够多多支持! 1.今天我先分享一个遮罩层弹 ...