[BZOJ4556][Tjoi2016&Heoi2016]字符串 后缀数组+主席树
4556: [Tjoi2016&Heoi2016]字符串
Time Limit: 20 Sec Memory Limit: 128 MB
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
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=;
int cnt[N],xx[N],yy[N],n;
char s[N];
int rank[N],sa[N],height[N],bin[],f[N][];
inline void get_sa(int m)
{
int *x=xx,*y=yy;
register int i,j,p,k;
for(i=;i<m;++i)cnt[i]=;
for(i=;i<n;++i)++cnt[x[i]=s[i]];
for(i=;i<m;++i)cnt[i]+=cnt[i-];
for(i=n-;~i;--i)sa[--cnt[x[i]]]=i;
for(k=,p=;k<=n&&p<n;k<<=,m=p)
{
for(p=,i=n-k;i<n;++i)y[p++]=i;
for(i=;i<n;++i)if(sa[i]>=k)y[p++]=sa[i]-k;
for(i=;i<m;++i)cnt[i]=;
for(i=;i<n;++i)++cnt[x[y[i]]];
for(i=;i<m;++i)cnt[i]+=cnt[i-];
for(i=n-;~i;--i)sa[--cnt[x[y[i]]]]=y[i];
swap(x,y),x[sa[]]=,p=;
for(i=;i<n;++i)
x[sa[i]]=(y[sa[i]]==y[sa[i-]]&&y[sa[i]+k]==y[sa[i-]+k])?p-:p++;
}
}
inline void get_height()
{
register int i,j,k;
for(i=;i<n;++i)rank[sa[i]]=i;
for(k=i=;i<n;height[rank[i++]]=k)
for(k=k?k-:k,j=sa[rank[i]-];s[i+k]==s[j+k];++k);
}
inline void ST()
{
register int i,j;
for(bin[]=i=;i<=;++i)
bin[i]=bin[i-]<<;
for(j=;j<n;++j)f[j][]=height[j];
for(i=;bin[i-]<=n;++i)
for(j=;j+bin[i]<=n;++j)
f[j][i]=min(f[j][i-],f[j+bin[i-]][i-]);
}
struct node
{
node *ch[];int cnt;
node(){ch[]=ch[]=NULL;cnt=;}
inline void update(){cnt=ch[]->cnt+ch[]->cnt;}
}*null=new node(),*root[N];
inline node* newnode()
{node *o=new node();o->ch[]=o->ch[]=null;return o;}
inline bool query(node *a,node *b,int L,int R,int l,int r)
{
if(L<=l&&r<=R)return b->cnt-a->cnt;
int mi=l+r>>;bool ret=;
if(L<=mi)ret|=query(a->ch[],b->ch[],L,R,l,mi);
if(mi<R)ret|=query(a->ch[],b->ch[],L,R,mi+,r);
return ret;
}
inline void get_range(int val,int &l,int &r)
{
register int j;
for(j=;~j&&r<n;--j)
if(r+bin[j]-<n&&f[r+][j]>=val)r+=bin[j];
for(j=;~j&&l;--j)
if(l-bin[j]+>=&&f[l-bin[j]+][j]>=val)l-=bin[j];
}
inline bool judge(int a,int b,int c,int minimum)
{
int l=rank[c],r=rank[c],right=minimum?b-minimum+:b;
get_range(minimum,l,r);
if(query(a?root[a-]:null,root[right],l,r,,n-))return ;
return ;
}
inline void insert(node *&o,node *old,int l,int r,int pos)
{
o->cnt=old->cnt+;int mi=(l+r)>>;if(l==r)return;
if(pos<=mi)
o->ch[]=old->ch[],o->ch[]=newnode(),
insert(o->ch[],old->ch[],l,mi,pos);
else
o->ch[]=old->ch[],o->ch[]=newnode(),
insert(o->ch[],old->ch[],mi+,r,pos);
o->update();
}
inline void Tree_intn()
{
register int i;
null->ch[]=null->ch[]=null;
for(i=;i<n;++i)root[i]=newnode();
insert(root[],null,,n-,rank[]);
for(i=;i<n;++i)
insert(root[i],root[i-],,n-,rank[i]);
}
int main()
{
register int i,j,k,a,b,c,d,m,l,mi,r,ans;
scanf("%d%d%s",&n,&m,s),s[n++]=,
get_sa(),get_height(),ST(),Tree_intn();
while(m--)
{
scanf("%d%d%d%d",&a,&b,&c,&d),--a,--b,--c,--d;
l=,mi,r=min(b-a+,d-c+),ans=;
while(l<=r)
if(judge(a,b,c,(mi=l+r>>)))l=mi+,ans=mi;
else r=mi-;
printf("%d\n",ans);
}
}
[BZOJ4556][Tjoi2016&Heoi2016]字符串 后缀数组+主席树的更多相关文章
- BZOJ4556:[TJOI\HEOI2016]字符串(后缀数组,主席树,二分,ST表)
Description 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一个长为n的字符串s,和m个问题.佳媛姐姐必须正确回答这m个问题,才能打开箱 ...
- bzoj 4556 [Tjoi2016&Heoi2016]字符串——后缀数组+主席树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4556 本来只要查 ht[ ] 数组上的前驱和后继就行,但有长度的限制.可以二分答案解决!然后 ...
- Bzoj4556: [Tjoi2016&Heoi2016]字符串 后缀数组
4556: [Tjoi2016&Heoi2016]字符串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 169 Solved: 87[Sub ...
- bzoj4556: [Tjoi2016&Heoi2016]字符串 (后缀数组加主席树)
题目是给出一个字符串,每次询问一个区间[a,b]中所有的子串和另一个区间[c,d]的lcp最大值,首先求出后缀数组,对于lcp的最大值肯定是rank[c]的前驱和后继,但是对于这个题会出现问题,就是题 ...
- [HEOI2016] 字符串 - 后缀数组,主席树,ST表,二分
[HEOI2016] 字符串 Description 给定一个字符串 \(S\), 有 \(m\) 个询问,每个询问给定参数 \((a,b,c,d)\) ,求 \(s[a..b]\) 的子串与 \(s ...
- 【BZOJ4556】[Tjoi2016&Heoi2016]字符串 后缀数组+二分+主席树+RMQ
[BZOJ4556][Tjoi2016&Heoi2016]字符串 Description 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一 ...
- BZOJ 4556 [Tjoi2016&Heoi2016]字符串 ——后缀数组 ST表 主席树 二分答案
Solution 1: 后缀数组暴力大法好 #include <map> #include <cmath> #include <queue> #include &l ...
- P4094 [HEOI2016/TJOI2016]字符串 后缀数组+主席树+二分答案
$ \color{#0066ff}{ 题目描述 }$ 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一个长为n的字符串s,和m个问题.佳媛姐姐必须 ...
- BZOJ3473:字符串(后缀数组,主席树,二分,ST表)
Description 给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串? Input 第一行两个整数n,k. 接下来n行每行一个字符串. Output 一 ...
随机推荐
- python连接数据库问题小结
在使用python连接数据库的时候遇到了这个问题: 大概意思就是在django的setting.py中配置的用户名和密码报错. 主要就是修改setting.py的配置 其中在里边的name和user项 ...
- 稳重商务风格教师求职简历免费word模板
30款稳重商务风格教师求职简历免费word模板,也可用于其他专业和职业,个人免费简历模板,个人简历表免费,个人简历表格. 声明:该简历模板仅用于个人欣赏使用,请勿用于商业用途,谢谢. 下载地址:百度网 ...
- AssetBundle粒度与分配策略
决定如何将项目内的资源分配到 AssetBundle 是不容易的.简单的规则都很有诱惑性,比如将所有对象都放置到他们自己的 AssetBundle 中或者将所有对象都放到一个 AssetBundle ...
- centos7 上安装mysql5.7后登录报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: Yes 或者No)
原文转载自以下链接:https://blog.csdn.net/keepd/article/details/77151006 安装完mysql后会有个临时密码去日志查看,但是查看登录修改密后还是不行 ...
- DNS分离解析IPV6与IPV4用户
IPV6改造中经常会遇到,网站使用了CDN,但是CDN厂商还不支持IPV6的情况,而AAAA.A.CNAME记录互相冲突,想实现IPV6用户得到AAAA记录,IPV4用户得到CNAME记录的需求. 解 ...
- Nginx内置的嵌入变量
Nginx核心模块ngx_http_core_module自带有许多内置嵌入的变量,这些变量方便我们配置和使用nginx,在nginx的配置文件中我们可以以$开头直接使用这些变量,这些变量表示客户端请 ...
- 为 GlusterFS 设计新的xlator (编译及调用过程分析)
GlusterFS 是一个开源的网络分布式文件系统,前一阵子看了一点GlusterFS(Gluster)的代码,修改了部分代码,具体是增加了一个定制的xlator,简单记录一下. Gluster与xl ...
- 最新的CocoaPods 安装及使用
当在开发iOS应用时,会经常使用到很多的第三方开源类库,一般的方法是直接从GitHub下载,然后拖到项目中使用,如果该开源类库不依赖其他的类库,就可以直接使用:如果该开源类库还依赖一些其他的类库,则需 ...
- 解决maven update project 后项目jdk变成1.5
http://blog.csdn.net/jay_1989/article/details/52687934
- Buaaclubs项目介绍
简介 首先,它是社团资讯的集散地,任何希望了解北航社团信息或活动情况的同学都可以在这个平台上获取自己需要的信息,并且可以随时随地地参与社团互动,方便快捷地实现网上报名.在线咨询.活动参与等多种功能. ...