博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj3998[TJOI2015]弦论
阅读量:4592 次
发布时间:2019-06-09

本文共 1721 字,大约阅读时间需要 5 分钟。

题意:给一个串,求:

1.本质不同的所有子串中字典序第k大的(即相同子串多次出现算一个)

2.所有子串中字典序第k大的(即相同子串多次出现算多个)

对于第一种情况,后缀数组的做法很经典:按照所有后缀的字典序依次加入后缀,新加入一个后缀会产生”这个后缀的长度减去这个后缀的height值”这么多个子串,显然每次新产生的子串比之前产生的所有子串的字典序都大,那么就可以在前缀和上二分了,预处理O(nlogn),单组询问O(logn)(不考虑询问的输出)

对于第二种情况,可以后缀自动机,然而我不会,于是我们依然考虑后缀数组.和第一种情况类似,我们需要考虑每个后缀产生多少个子串.显然每个后缀都会产生这个后缀的长度这么多个子串,但这并没有什么用.我们不妨考虑把一个子串的多次出现全都算到这个子串在所有出现的后缀中字典序最小的那个后缀上,那么只需按照height从大到小合并,并查集维护一下就可以了.然后就可以前缀和+二分找出第k大的子串在是哪一个后缀所产生的字典序第几大的子串.这之后我们还需要支持查询某个后缀产生的子串中第k大的串是多少,我不太会处理,于是强行又写了一遍按height合并所有后缀,预处理O(nlogn)+单组询问O(nlogn)(并查集只写了路径压缩所以是log的),非常虚,没T真是感动.

#include
#include
#include
using namespace std;const int maxn=500005;int sa[maxn],rank[maxn],height[maxn];int tmp[2][maxn],key[maxn],sum[maxn];char str[maxn];void getsa(int n,int m){ int i,j,k,p,*rk=tmp[0],*res=tmp[1]; for(i=0;i
=0;--i)sa[--sum[rk[i]]]=i; for(j=1,p=0;p
<<=1,m=p){ for(i=0;i
=j)res[p++]=sa[i]-j; for(i=0;i
=0;--i)sa[--sum[key[i]]]=res[i]; for(res[sa[0]]=0,p=1,i=1;i
=1;--i){ int rt0=find(seq[i]-1),rt1=find(seq[i]); cnt[rt0]+=height[seq[i]]*1ll*sz[rt1];cnt[rt1]-=height[seq[i]]*1ll*sz[rt1]; link(seq[i],seq[i]-1); } for(int i=1;i<=n;++i)cnt[i]+=cnt[i-1]; if(cnt[n]
=1;--i){ //printf("height[%d]==%d\n",seq[i],height[seq[i]]); link(seq[i],seq[i]-1);mark[height[seq[i]]]=sz[find(pos)]; } for(int i=n-sa[pos];i>=1;--i)if(!mark[i])mark[i]=max(1,mark[i+1]); // for(int i=n-sa[pos];i>=1;--i)printf("%d\n",mark[i]); int l=sa[pos],r; for(int i=n-sa[pos];i>=1;--i){ num-=mark[i]; if(num<=0){r=sa[pos]+i-1;break;} } for(int i=l;i<=r;++i)printf("%c",str[i]);printf("\n"); } return 0;}

 

转载于:https://www.cnblogs.com/liu-runda/p/6519556.html

你可能感兴趣的文章
再说Java集合,subList之于ArrayList
查看>>
Hibernate-validator校验框架使用
查看>>
ArcGIS Server开发教程系列(8)ArcGIS API for Javascript-控件(小部件)(续)纯代码...
查看>>
16.10—第三周
查看>>
软件工程第八次作业-例行报告
查看>>
算法:背包问题处理
查看>>
学习随笔(2017-1-10)
查看>>
jieba学习
查看>>
单例模式(Singleton Pattern)
查看>>
再谈async与await
查看>>
无根树转有根树
查看>>
for循环:用turtle画一颗五角星
查看>>
协方差的意义和计算公式(转)
查看>>
Restful规范
查看>>
趣图:正在调试,突然内存溢出了
查看>>
SSH免密码远程登录Linux
查看>>
网络数据处理
查看>>
传输层TCP和UDP的区别分析与应用场景
查看>>
React Native安装
查看>>
神经网络详解
查看>>