没错,又是这题,使用后缀自动机,反向建树,主席树维护right集合。

By:大奕哥

 #include<bits/stdc++.h>
using namespace std;
const int N=2e5+;
int rt[N],num,n,q,aa,bb,cc,dd,cnt,head[N],fa[N][];
char s[N];
struct tree{
int l,r;
}t[N*];
void change(int &x,int l,int r,int p)
{
if(!x)x=++num;
if(l==r)return;
int mid=l+r>>;
if(p>mid)change(t[x].r,mid+,r,p);
else change(t[x].l,l,mid,p);
}
void merge(int &x,int y)
{
if(!x||!y){x=x+y;return;}
++num;t[num]=t[x];x=num;
merge(t[x].l,t[y].l);
merge(t[x].r,t[y].r);
}
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(mid<L)return query(t[x].r,mid+,r,L,R);
else if(mid>R)return query(t[x].l,l,mid,L,R);
else return query(t[x].l,l,mid,L,mid)|query(t[x].r,mid+,r,mid+,R);
}
struct edge{
int to,nex;
}e[N];
void addedge(int x,int y)
{
e[++cnt].to=y;e[cnt].nex=head[x];head[x]=cnt;
}
void dfs(int x)
{
for(int i=;i<=;++i)fa[x][i]=fa[fa[x][i-]][i-];
for(int i=head[x];i;i=e[i].nex)
{
int y=e[i].to;
fa[y][]=x;dfs(y);
}
}
struct SAM
{
int cnt,root,last,c[N][],f[N],dp[N],tt[N],pos[N],p[N],r[N],id[N],l[N];
SAM(){cnt=;last=root=++cnt;}
void add(int x,int dd)
{
int now=last,a=++cnt;last=a;id[a]=dd;
l[a]=l[now]+;p[dd]=a;
for(;now&&!c[now][x];now=f[now])c[now][x]=a;
if(!now)f[a]=root;
else{
int q=c[now][x];
if(l[q]==l[now]+)f[a]=q;
else{
int b=++cnt;id[b]=dd;
l[b]=l[now]+;
f[b]=f[q];
f[a]=f[q]=b;
memcpy(c[b],c[q],sizeof(c[q]));
for(;now&&c[now][x]==q;now=f[now])c[now][x]=b;
}
}
return;
}
void sort(){
for(int i=;i<=cnt;++i)tt[l[i]]++;
for(int i=;i<=n;++i)tt[i]+=tt[i-];
for(int i=;i<=cnt;++i)r[tt[l[i]]--]=i;
return;
}
bool judge(int x,int ll)
{
for(int i=;i>=;--i)
if(l[fa[x][i]]>=ll)x=fa[x][i];
return query(rt[x],,n,aa+ll-,bb);
}
void work()
{
for(int i=cnt;i>=;--i)
{
int x=r[i];
change(rt[x],,n,id[x]);
merge(rt[f[x]],rt[x]);
addedge(f[x],x);
}dfs();int ans=;
for(int i=;i<=q;++i)
{ scanf("%d%d%d%d",&aa,&bb,&cc,&dd);
int ll=,rr=min(bb-aa+,dd-cc+);ans=;
aa=n-aa+;bb=n-bb+;cc=n-cc+;dd=n-dd+;
swap(aa,bb);swap(cc,dd);int x=p[dd];
while(ll<=rr)
{
int mid=ll+rr>>;
if(judge(x,mid))ll=mid+,ans=mid;
else rr=mid-;
}
printf("%d\n",ans);
}
return;
}
}A;
int main()
{
scanf("%d%d",&n,&q);
scanf("%s",s+);
reverse(s+,s++n);
for(int i=;i<=n;++i)A.add(s[i]-'a',i);
A.sort();A.work();
return ;
}

BZOJ4556 HEOI2016字符串的更多相关文章

  1. BZOJ4556 HEOI2016 字符串

    后缀数组. 复习了后缀数组后发现这题真的很好写. 我们只需要将c依次向前向后扩展,找落在[a,b]区间内的最大值,遍历过程中不断用height数组更新. 复杂度就是后缀数组,比主席树的快多了. By: ...

  2. 【BZOJ4556】[Tjoi2016&Heoi2016]字符串 后缀数组+二分+主席树+RMQ

    [BZOJ4556][Tjoi2016&Heoi2016]字符串 Description 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一 ...

  3. [BZOJ4556][TJOI2016&&HEOI2016]字符串(二分答案+后缀数组+RMQ+主席树)

    4556: [Tjoi2016&Heoi2016]字符串 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1360  Solved: 545[S ...

  4. Bzoj4556: [Tjoi2016&Heoi2016]字符串 后缀数组

    4556: [Tjoi2016&Heoi2016]字符串 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 169  Solved: 87[Sub ...

  5. [BZOJ4556][Tjoi2016&Heoi2016]字符串 后缀数组+主席树

    4556: [Tjoi2016&Heoi2016]字符串 Time Limit: 20 Sec  Memory Limit: 128 MB Description 佳媛姐姐过生日的时候,她的小 ...

  6. [BZOJ4556][Tjoi2016&Heoi2016]字符串 主席树+二分+倍增+后缀自动机

    4556: [Tjoi2016&Heoi2016]字符串 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1215  Solved: 484[S ...

  7. Bzoj 4556: [Tjoi2016&Heoi2016]字符串

    4556: [Tjoi2016&Heoi2016]字符串 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 177  Solved: 92[Sub ...

  8. 【BZOJ4556】字符串(后缀数组,主席树)

    [BZOJ4556]字符串(后缀数组,主席树) 题面 BZOJ 题解 注意看题: 要求的是\([a,b]\)的子串和[c,d]的\(lcp\)的最大值 先来一下暴力吧 求出\(SA\)之后 暴力枚举\ ...

  9. 4556: [Tjoi2016&Heoi2016]字符串

    4556: [Tjoi2016&Heoi2016]字符串 链接 分析: 首先可以二分这个长度.此时需要判断是否存在一个以b结尾的前缀,满足与[c,d]的lcp大于等于mid. 如果我们把串翻转 ...

随机推荐

  1. IE条件注释判断

    相信大家都知道IE有专门的注释条件判断来引入一些css.js.html代码,但是语法有点拗口,记不住,下面我来做一下笔记: 正常的html注释: <!--注释注释注释注释...--> 注释 ...

  2. Hadoop生态圈-Azkaban实战之Command类型多job工作流flow

    Hadoop生态圈-Azkaban实战之Command类型多job工作流flow 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Azkaban内置的任务类型支持command.ja ...

  3. python操作txt文件中数据教程[2]-python提取txt文件

    python操作txt文件中数据教程[2]-python提取txt文件中的行列元素 觉得有用的话,欢迎一起讨论相互学习~Follow Me 原始txt文件 程序实现后结果-将txt中元素提取并保存在c ...

  4. Spark记录-scala快速入门

    1.hello world程序 object HelloWorld { def main(args: Array[String]) { println("Hello,World!" ...

  5. 学了display:flex垂直居中容易多了

    以前div内部的文字垂直居中,使用height = line-height,现在可以使用display:flex来实现了 .div{ display:flex; align-items:center; ...

  6. Jquery教你写一个简单的轮播.

    这个我表示写的不咋地-_-//,但是胜在简单,可优化性不错. 实际上我本来想写个复杂点的结构的,但是最近忙成狗了!!!!所以大家就讲究着看吧 HTML结构 <div class="ba ...

  7. OnContextMenu事件(转)

    用oncontextmenu事件单禁用右键菜单 一个页面中,BODY中用oncontextmenu='return false'来取消鼠标右键:在JS中设置oncontextmenu='return ...

  8. AngularJs -- 内置指令

    AngularJS提供了一系列内置指令.其中一些指令重载了原生的HTML元素,比如<form>和<a>标签, 当在HTML中使用标签时,并不一定能明确看出是否在使用指令. 其他 ...

  9. python內建模块之datetime

    from:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143193755 ...

  10. 终极利器!利用appium和mitmproxy登录获取cookies

    环境搭建 参考我之前写的https://www.cnblogs.com/c-x-a/p/9163221.html appium 代码start_appium.py # -*- coding: utf- ...