[BZOJ3230]相似子串(后缀数组)
显然可以通过后缀数组快速找到询问的两个串分别是什么,然后正反各建一个后缀数组来求两个串的LCP和LCS即可。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
typedef long long ll;
using namespace std; const int N=,inf=1e9;
char s[N];
ll ans,x,y;
int n,Q,lg[N];
struct P{ int x,y; }; struct SA{
ll sm[N];
char s[N];
int x[N],y[N],c[N],sa[N],rk[N],h[N],mn[N][]; bool Cmp(int a,int b,int l){ return a+l<=n && b+l<=n && y[a]==y[b] && y[a+l]==y[b+l]; } void build(int m){
rep(i,,m) c[i]=;
rep(i,,n) c[x[i]=s[i]-'a'+]++;
rep(i,,m) c[i]+=c[i-];
for (int i=n; i; i--) sa[c[x[i]]--]=i;
for (int k=,p=; p<n; k<<=,m=p){
p=;
rep(i,n-k+,n) y[++p]=i;
rep(i,,n) if (sa[i]>k) y[++p]=sa[i]-k;
rep(i,,m) c[i]=;
rep(i,,n) c[x[y[i]]]++;
rep(i,,m) c[i]+=c[i-];
for (int i=n; i; i--) sa[c[x[y[i]]]--]=y[i];
rep(i,,n) y[i]=x[i]; x[sa[p=]]=;
rep(i,,n) x[sa[i]]=Cmp(sa[i],sa[i-],k) ? p : ++p;
}
} void init(){
rep(i,,n) rk[sa[i]]=i;
int k=;
rep(i,,n){
for (int j=sa[rk[i]-]; i+k<=n && j+k<=n && s[i+k]==s[j+k]; k++);
h[rk[i]]=k; if (k) k--;
}
rep(i,,n) sm[i]=sm[i-]+n-sa[i]+-h[i],mn[i][]=h[i];
rep(j,,) rep(i,,n-(<<j)+) mn[i][j]=min(mn[i][j-],mn[i+(<<(j-))][j-]);
} int que(int l,int r){
if (l==r) return inf;
l++; int t=lg[r-l+]; return min(mn[l][t],mn[r-(<<t)+][t]);
} P get(ll k){
int L=,R=n; int ans1,ans2;
if (sm[n]<k) return (P){-,-};
while (L<=R){
int mid=(L+R)>>;
if (sm[mid]>=k) ans1=mid,ans2=n-sa[mid]+-(sm[mid]-k),R=mid-; else L=mid+;
}
return (P){ans1,ans2};
}
}S1,S2; int main(){
freopen("bzoj3230.in","r",stdin);
freopen("bzoj3230.out","w",stdout);
scanf("%d%d%s",&n,&Q,s+);
rep(i,,n) lg[i]=lg[i>>]+;
rep(i,,n) S1.s[i]=S2.s[n-i+]=s[i];
S1.build(); S2.build(); S1.init(); S2.init();
rep(i,,Q){
scanf("%lld%lld",&x,&y); ans=;
if (S1.sm[n]<y){ puts("-1"); continue; }
P xx=S1.get(x),yy=S1.get(y);
ll k=min(S1.que(xx.x,yy.x),min(xx.y,yy.y)); ans+=k*k;
xx.x=S2.rk[n-S1.sa[xx.x]+-xx.y]; yy.x=S2.rk[n-S1.sa[yy.x]+-yy.y];
k=min(S2.que(min(xx.x,yy.x),max(xx.x,yy.x)),min(xx.y,yy.y)); ans+=k*k;
printf("%lld\n",ans);
}
return ;
}
[BZOJ3230]相似子串(后缀数组)的更多相关文章
- BZOJ3230 相似子串[后缀数组+二分+st表]
BZOJ3230 相似子串 给一个串,查询排名i和j的子串longest common suffix和longest common prefix 思路其实还是蛮好想的,就是码起来有点恶心.可以发现后缀 ...
- poj 2774 最长公共子串 后缀数组
Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 25752 Accepted: 10 ...
- URAL 1297 最长回文子串(后缀数组)
1297. Palindrome Time limit: 1.0 secondMemory limit: 64 MB The “U.S. Robots” HQ has just received a ...
- poj 1743 Musical Theme(最长重复子串 后缀数组)
poj 1743 Musical Theme(最长重复子串 后缀数组) 有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复 ...
- Cogs 1709. [SPOJ705]不同的子串 后缀数组
题目:http://cojs.tk/cogs/problem/problem.php?pid=1709 1709. [SPOJ705]不同的子串 ★★ 输入文件:subst1.in 输出文件: ...
- BZOJ 1396: 识别子串( 后缀数组 + 线段树 )
这道题各位大神好像都是用后缀自动机做的?.....蒟蒻就秀秀智商写一写后缀数组解法..... 求出Height数组后, 我们枚举每一位当做子串的开头. 如上图(x, y是height值), Heigh ...
- BZOJ 3230 相似子串 | 后缀数组 二分 ST表
BZOJ 3230 相似子串 题面 题解 首先我们要知道询问的两个子串的位置. 先正常跑一遍后缀数组并求出height数组. 对于每一个后缀suffix(i),考虑以i开头的子串有多少是之前没有出现过 ...
- bzoj 3230 相似子串——后缀数组
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3230 作出后缀数组,从 LCP 看每个位置对于本质不同子串的贡献,而且他们已经按前面部分排好 ...
- 【poj1743-Musical Theme】不可重叠最长重复子串-后缀数组
http://poj.org/problem?id=1743 这题是一道后缀数组的经典例题:求不可重叠最长重复子串. 题意: 有N(1 <= N <=20000)个音符的序列来表示一首乐曲 ...
随机推荐
- 对 OAuth2 和非标 DingDing OAuth2 的一次尝试
印象中工作以来还从来没搞过一次 OAuth2 的接入- -,似乎只停留在愉快的使用阶段.比如现在很多网站都接了 wx 二维码扫码登录或者微博登录.所以一直只是享受着这样的便利,却没有机会自己来搞一搞把 ...
- GoCN每日新闻(2019-11-04)
GoCN每日新闻(2019-11-04) GoCN每日新闻(2019-11-04) 1. Go中垃圾收集器是如何标记内存的 https://medium.com/a-journey-with-go ...
- JMeter的基本使用
什么是Jmeter JMeter是Apache基于Java开发的压力测试工具,通俗的说,你想知道你的接口有多猛,你的服务器是否耐揍,这个家伙可以用数据告诉你.原来学过JMeter的基本使用,发现想不起 ...
- 您使用的私钥格式错误,请检查RSA私钥配置,charset = utf-8 密钥集不存在
支付宝突然报异常 您使用的私钥格式错误,请检查RSA私钥配置,charset = utf-8 经排查:系统日志 System.Security.Cryptography.CryptographicEx ...
- js读取sqlserver数据库,输出至html
代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <m ...
- 解决wordpress修改固定链接后出现404错误不能访问文章的方法
首先,建议大家安装完wordpress网站程序之后第一时间设置一下固定链接,避免以后修改出错.在wp后台仪表盘左侧导航里找到“设置——固定链接”即可配置你的wordpress固定链接,通常我习惯使用的 ...
- 刷题记录:[强网杯 2019]Upload
目录 刷题记录:[强网杯 2019]Upload 一.知识点 1.源码泄露 2.php反序列化 刷题记录:[强网杯 2019]Upload 题目复现链接:https://buuoj.cn/challe ...
- sql查询条件参数为空
查询某些值为空的数据 select * from usertable where name is null or page is null
- hbuilderx - 常用快捷键操作
常用的操作有(缺少一个快捷键,就是选中行) 1. ctrl+/ 注释代码 2. ctrl+y 恢复撤销 3. ctrl+x 剪切 4. ctrl+z 撤销 5. ctrl+c 复制 6. ctrl+p ...
- Jav获取文件的MD5码,比较两个文件内容是否相同
Jav获取文件的MD5码,比较两个文件内容是否相同 代码: System.out.println(DigestUtils.md5Hex(new FileInputStream(new File(&qu ...