Problem

BZOJ

Solution

我周围的聚聚一看就说这不是道SA的傻逼题吗……

好吧,考虑用SAM怎么做。
先对反串建出SAM,[a,b]中的所有子串不好处理,因为在parent数上代表的链实在太多了,所以考虑从子串[c,d]开始下手
我们可以考虑二分lcp的长度,那么我们可以在O(log⁡n)O(\log n)O(logn)的时间内找到这个子串所对应的节点,然后我们可以用主席树来查在[a,b]中是否有存在这么一个子串。

如何在O(log⁡n)O(\log n)O(logn)的时间内找到这个子串所对应的节点?我们在建SAM时可以记录前缀[1,i][1,i][1,i]所代表的节点,然后在parent树找到最深的节点使得longest大于等于子串长,倍增即可。

时间复杂度O(mlog⁡2n)O(m\log^2 n)O(mlog2n)

Code

#include <assert.h>
#include <algorithm>
#include <cstring>
#include <cstdio>
#define rg register
using namespace std;
typedef long long ll;
const int maxn=200010,maxm=4000010;
template <typename Tp> inline int getmin(Tp &x,Tp y){return y<x?x=y,1:0;}
template <typename Tp> inline int getmax(Tp &x,Tp y){return y>x?x=y,1:0;}
template <typename Tp> inline void read(Tp &x)
{x=0;int f=0;char ch=getchar();while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();if(ch=='-') f=1,ch=getchar();while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();if(f) x=-x;
}
int n,m,sz,lst,cnt,ans,ch[maxn][26],l[maxn],pre[maxn],pos[maxn];
int t[maxn],top[maxn],f[18][maxn],rt[maxn],lc[maxm],rc[maxm];
char s[maxn];
void insert(int c)
{int p=lst,np=++sz;l[np]=l[p]+1;lst=np;for(;!ch[p][c]&&p;p=pre[p]) ch[p][c]=np;if(!p) pre[np]=1;else{int q=ch[p][c];if(l[q]==l[p]+1) pre[np]=q;else{int nq=++sz;l[nq]=l[p]+1;memmove(ch[nq],ch[q],sizeof(ch[q]));pre[nq]=pre[q];pre[np]=pre[q]=nq;for(;ch[p][c]==q;p=pre[p]) ch[p][c]=nq;}}
}
int getpos(int ql,int qr)
{int len=qr-ql+1,x=pos[qr];for(int i=17;~i;i--)if(l[f[i][x]]>=len)x=f[i][x];return x;
}
inline int new_node(){if(cnt+10<maxm) return ++cnt;assert(0);}
void update(int l,int r,int pos,int& rt)
{if(!rt) rt=new_node();if(l==r) return ;int m=(l+r)>>1;if(pos<=m) update(l,m,pos,lc[rt]);else update(m+1,r,pos,rc[rt]);
}
int query(int l,int r,int L,int R,int rt)
{if(!rt) return 0;if(L<=l&&r<=R) return 1;int m=(l+r)>>1,res=0;if(L<=m) res|=query(l,m,L,R,lc[rt]);if(res) return 1;if(m<R) res|=query(m+1,r,L,R,rc[rt]);return res;
}
int merge(int x,int y)
{if(!x||!y) return x+y;int now=new_node();lc[now]=merge(lc[x],lc[y]);rc[now]=merge(rc[x],rc[y]);return now;
}
void input()
{read(n);read(m);scanf("%s",s+1);reverse(s+1,s+n+1);lst=sz=1;for(rg int i=1;i<=n;i++){insert(s[i]-'a');pos[i]=lst;update(1,n,i,rt[lst]);}for(rg int i=1;i<=sz;i++) ++t[l[i]],f[0][i]=pre[i];for(rg int i=1;i<=sz;i++) t[i]+=t[i-1];for(rg int i=1;i<=sz;i++) top[t[l[i]]--]=i;for(rg int i=1;i<=sz;i++){int x=top[i];for(rg int j=1;j<18;j++)f[j][x]=f[j-1][f[j-1][x]];}for(rg int i=sz;i>1;i--){int x=top[i];rt[pre[x]]=merge(rt[pre[x]],rt[x]);}
}
int main()
{#ifndef ONLINE_JUDGEfreopen("in.txt","r",stdin);#endifint a,b,c,d,x,L,R,mid;input();while(m--){read(a);read(b);read(c);read(d);a=n-a+1;b=n-b+1;c=n-c+1;d=n-d+1;L=1;R=c-d+1;ans=0;while(L<=R){mid=(L+R)>>1;x=getpos(c-mid+1,c);if(b+mid-1<=a&&query(1,n,b+mid-1,a,rt[x])) ans=mid,L=mid+1;else R=mid-1;}printf("%d\n",ans);}return 0;
}

BZOJ4556 HEOI2016 字符串相关推荐

  1. [BZOJ4556][TJOI2016HEOI2016]字符串(二分答案+后缀数组+RMQ+主席树)

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

  2. [BZOJ4556][Tjoi2016Heoi2016]字符串 主席树+二分+倍增+后缀自动机

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

  3. Bzoj4556 [Tjoi2016Heoi2016]字符串

    Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 846  Solved: 327 Description 佳媛姐姐过生日的时候,她的小伙伴从某东上买了 ...

  4. 基础省选+NOI-第6部分 字符串

    1.Kmp KMP算法 KMP算法_哔哩哔哩_bilibili KMP算法计算next函数值(教材版,超简单!) KMP算法计算next函数值(教材版,超简单!)_哔哩哔哩_bilibili KMP算 ...

  5. [暑假的bzoj刷水记录]

    (这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊  堆一起算了 隔一段更新一下.  7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...

  6. [HEOI2016/TJOI2016]字符串 (后缀数组+主席树+二分)

    description 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一个长为 n 的字符串 s,和 m 个问题.佳媛姐姐必须正确回答这 m 个问 ...

  7. 洛谷P4094 [HEOI2016/TJOI2016]字符串【后缀数组+主席树+st表】

    时空限制 2000ms / 256MB 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一个长为n的字符串s,和m个问题.佳媛姐姐必须正确 ...

  8. 主席树 + 后缀数组求LCP + 二分套二分 ---- P4094 [HEOI2016/TJOI2016]字符串

    题目链接 题目大意: 解题思路: 设我们的答案为midmidmid(注意这里有坑是[a,b][a,b][a,b]的所有子串和[c,d][c,d][c,d]这个子串的最长lcplcplcp),那么我们会 ...

  9. HEOI2016/TJOI2016 字符串问题

    题目链接:戳我 非常不好意思,因为想要排版,所以今天先只把代码贴出来,明天补题解. 40pts暴力:直接暴力匹配 #include<iostream>#include<cstring ...

  10. 洛谷 P4094 [HEOI2016/TJOI2016]字符串 后缀数组+二分+主席树

    题目链接 后缀数组 题目分析: sa[i] – 第i小的后缀的编号 rank[i] --编号为i的后缀排第几: height[i] – 第i和第i-1的最长lcp最长公共前缀: 1.二分答案,答案肯定 ...

最新文章

  1. mvc ajax_返回数据
  2. stm32f103zet6linux,stm32f103zet6定时器详解及应用
  3. Yocto的使用实例
  4. div方框弯曲边样式_使用弯曲样式编辑文本
  5. 服务器与本地文件共享文件夹,云服务器对本地服务器共享文件夹
  6. struct 和enum的用法
  7. “OSPF” 开销值、协议优先级及计时器的修改
  8. 德标螺纹规格对照表_(外)内六角螺塞标准编号-国家标准JB/德标DIN
  9. Android实现多国语言适配:app名称随系统的语言而更换
  10. 怎样用计算机表白我爱你,怎样用简单有“内涵”的话向喜欢的人表白 我爱你!...
  11. POSCMS 框架使用导航
  12. web网页设计期末课程大作业——基于HTML仿唯品会电商项目的设计与实现
  13. 关于对MIDlet套件进行数字签名
  14. 播客49:Lyle Troxell
  15. 2020-09-04 CD40193十六进制加减Multisim仿真
  16. APP开发之apicloud(一)
  17. Git 如何生成SSH key
  18. 使用windows钩子捕获进程的启动和关闭消息
  19. 孙陶然:企业需要建立自己的人才标准体系
  20. 如何在Linux中使用LNMP一键安装包快速安装LNMP环境

热门文章

  1. Word小技巧总结(持续更新中……)
  2. [渝粤教育] 广东-国家-开放大学 21秋期末考试电算化会计10169k2
  3. InsetGAN :基于多个stylegan2-ada生成器拼接的全身人像生成(2203.InsetGAN for Full-Body Image Generation)
  4. word表格中多行只有一行字,让一行字居中的设置操作
  5. NLP数据集:GLUE【CoLA(单句子分类)、SST-2(情感二分类)、MRPC、STS-B、QQP、MNLI、QNLI、RTE、WNLI】【知名模型都会在此基准上进行测试】
  6. BZOJ2434【NOI2011】阿狸的打字机 AC自动机+Fail树+树状数组
  7. java视频文件格式转换,视频文件格式转换器-视频文件格式转换器 2018 官方版
  8. Imitate_ProcessRR轮盘调度
  9. 软考:嵌入式系统设计师
  10. 中日交流日本语初级上