后缀数组的题博客里没放进去过。。所以挖了一题写写 充实下博客 顺便留作板子。。

一个字符串S中 内容不同的子串 有 sigma{n-sa[i]+1-h[i]}   (噢 这里的h[]就是大家熟知的height[])

所以l=1,r=上述sigma 二分 答案是字典序第几大的子串。

然后 求S中第k大的子串W : 因为h[i]是与i-1有关的 所以要从n downto 1,k-=n-sa[i]+1-h[i] 至 k再减就非正了

显然这样扫过来 子串字典序是递减的  因此可以得到第k大子串W

然后再贪心 n downto 1 若遇到比 W大的子串 就划分,验证 当前二分的这个第k大可不可行

判断 比W大还是小 用hash 二分求LCP即可

 #include <bits/stdc++.h>
#define N 200005
#define LL long long
using namespace std;
const LL mo=;
int F[],a[N],rank[N],sa[N],h[N],g1[N],g2[N],next[N],n,m,ans,k,t,l,r,mid,x,y,z;
char S[N]; LL f[N],w[N];
int oh(int k,int t,int p,int q){
int l=,r=min(t-k,q-p)+,j;
while (l<r){
j=l+r+>>;
(f[k+j-]-f[k-]*w[j]%mo+mo)%mo==(f[p+j-]-f[p-]*w[j]%mo+mo)%mo?
l=j:r=j-;
}
if (k+l>t) return ;
if (p+l>q) return ;
return a[k+l]>a[p+l];
}
int jud(int u){
int p,q,k,t;
for (int i=n;i;--i)
if (n-sa[i]+-h[i]<u) u-=n-sa[i]+-h[i];
else {p=sa[i];q=n-u+;break;}
t=n; k=;
for (int i=n;i;)
if (oh(i,t,p,q)){
if (i==t) return ;
t=i; ++k;
} else --i;
if (k>m) return ; return ;
}
int main(){
scanf("%d",&m); scanf("%s",S+); n=strlen(S+);
w[]=;
for (int i=;i<=n;++i) {
a[i]=S[i]-'a'+;
F[a[i]]=;
f[i]=(f[i-]*+a[i])%mo;
w[i]=w[i-]*%mo;
}
for (int i=;i<=;++i) F[i]+=F[i-];
for (int i=;i<=n;++i) rank[i]=F[a[i]]; t=F[];
for (int m=;m<n;m<<=){
for (int i=;i<=n;++i){
next[i]=g1[rank[i+m]];
g1[rank[i+m]]=i;
}
for (int i=t;i>=;--i){
for (int j=g1[i];j;j=k){
k=next[j]; next[j]=g2[rank[j]]; g2[rank[j]]=j;
}
g1[i]=;
}
z=;
for (int i=;i<=t;++i){
y=-;
for (int j=g2[i];j;j=k){
k=next[j]; next[j]=;
if (y!=rank[j+m]) y=rank[j+m],++z;
h[j]=z;
}
g2[i]=;
}
t=z;
for (int i=;i<=n;++i) rank[i]=h[i];
}
for (int i=;i<=n;++i) sa[rank[i]]=i,h[i]=;
for (int i=,k=;i<=n;++i)
if (rank[i]!=){
if (k) --k;
while (a[i+k]==a[sa[rank[i]-]+k]) ++k;
h[rank[i]]=k; r+=n-i+-k;
}
l=; ++r;
while (l<r){
k=l+r+>>;
jud(k)?l=k:r=k-;
}
for (int i=n;i;--i)
if (n-sa[i]+-h[i]<l) l-=n-sa[i]+-h[i];
else {k=sa[i];t=n-l+;break;}
for (int i=k;i<=t;++i) printf("%c",a[i]+'a'-);
return ;
}

Assassin

后缀数组 hash求LCP BZOJ 4310: 跳蚤的更多相关文章

  1. bzoj 4310 跳蚤 二分答案+后缀数组/后缀树

    题目大意 给定\(k\)和长度\(\le10^5\)的串S 把串分成不超过\(k\)个子串,然后对于每个子串\(s\),他会从\(s\)的所有子串中选择字典序最大的那一个,并在选出来的\(k\)个子串 ...

  2. bzoj 4310: 跳蚤

    Description 很久很久以前,森林里住着一群跳蚤.一天,跳蚤国王得到了一个神秘的字符串,它想进行研究. 首先,他会把串分成不超过 k 个子串,然后对于每个子串 S,他会从S的所有子串中选择字典 ...

  3. ●BZOJ 4310 跳蚤

    ●赘述题目 给出一个字符串,要求分成k个子串,然后求出每个子串的字典序最大的子串(我称它为子子串),要使这k个子子串中的字典序最大的那个串(即魔力串)最小.输出该魔力串. (本题个人感觉很好,比较综合 ...

  4. HDU-4622 Reincarnation 后缀数组 | Hash,维护和,扫描

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4622 题意:给一个字符串,询问某字串的不同字串的个数. 可以用后缀数组来解决,复杂度O(n).先求出倍 ...

  5. FJUT3703 这还是一道数论题(二分 + hash + manacher 或者 STL + hash 或者 后缀数组 + hash)题解

    Problem Description 最后来个字符串签个到吧,这题其实并不难,所需的算法比较基础,甚至你们最近还上过课. 为了降低难度,免得所有人爆零.这里给几个提示的关键字 :字符串,回文,二分, ...

  6. URAL - 1297 后缀数组的做法 LCP应用

    题意:求最长回文子串 这种有专门的O(n)套板子算法,但作为练习还是用后缀数组来解吧 只需把相同的另一个串反接(中间用一个足够小且未出现的字符衔接),然后枚举回文串的中点,不断求解该点往前和往后计算的 ...

  7. Uva12206 Stammering Aliens 后缀数组&&Hash

    Dr. Ellie Arroway has established contact with an extraterrestrial civilization. However, all effort ...

  8. POJ 1743 Musical Theme (后缀数组,求最长不重叠重复子串)(转)

    永恒的大牛,kuangbin,膜拜一下,Orz 链接:http://www.cnblogs.com/kuangbin/archive/2013/04/23/3039313.html Musical T ...

  9. URAL 1297 后缀数组:求最长回文子串

    思路:这题下午搞了然后一直WA,后面就看了Discuss,里面有个数组:ABCDEFDCBA,这个我输出ABCD,所以错了. 然后才知道自己写的后缀数组对这个回文子串有bug,然后就不知道怎么改了. ...

随机推荐

  1. 什么是Service Mesh?

    转至大佬宋净明的博客:https://jimmysong.io/posts/what-is-a-service-mesh/ Service mesh 又译作 “服务网格”,作为服务间通信的基础设施层. ...

  2. 【BZOJ1430】小猴打架(Prufer编码)

    题意:求n个点带编号生成树的不同加边序列个数 n<=10^6 思路: WJMZBMR:额.首先他们打架的关系是一颗无根树,就有n^(n-2)种情况,还有打架的顺序,是(n-1)!种,乘起来就可以 ...

  3. hihoCoder #1014 : Trie树 [ Trie ]

    传送门 #1014 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互 ...

  4. File类的三种构造方法

    package cn.zmh.File; import java.io.File; /* * * File类的构造方法 三种重载形式 * * */ public class FileDemo1 { p ...

  5. 在访问RESTful接口时出现:Could not write content: No serializer found for class的问题解决小技巧收集

    注意:市面上对于写RESTful是用RestFul,其实是不规范的,标准写法RESTful. 在Java上,处理这个应该是没有继承Serializable类,然后通过Eclipse生成serialVe ...

  6. SAS学习笔记 - R的数据操作

    1.对象 1.1 对象及其内在属性 R中的处理数据就是对象,每个对象可以包含多个元素.对象有两个内在属性:类型和长度.类型是对象元素的基本种类,共四种:数值型,字符型,复数型和逻辑型.对象的类型和长度 ...

  7. win7右下角无线网图标显示未连接,但是实际上已连接上,也能上网

    首先,要确实是不是服务启动的问题,方法很简单,重新启动电脑就可以. 如果问题依旧,那么按下Win+R快捷键,输入“services.msc”,打开服务界面. 然后会看到右侧窗口出现好多设置项,找到“R ...

  8. No module named '_sqlite3'问题解决

    Centos自带的python版本是2.7的,后面我自己装了3.5版本的,在创建应用的时候python manager.py startapp users 时,就会报No module named ' ...

  9. 3.将maven项目jar纳入maven仓库,Mave项目依赖另外一个Maven项目的案例

     1 若想让maven项目依赖另外一个maven项目.被依赖的项目要在maven仓库中有对应的jar包,所以要对依赖的项目运行mvninstall命令. 2 新建第二个项目模块HelloFrien ...

  10. 最简单实用的MongoDB安装教程:在CentOS中使用 yum 安装MongoDB及服务器端配置详解

    一.准备工作: 运行yum命令查看MongoDB的包信息 [root@vm ~]# yum info mongo-10gen (提示没有相关匹配的信息,) 说明你的centos系统中的yum源不包含M ...