题目链接:

https://www.luogu.org/problem/P3975

题意:

求出所有字串的第k大子串

有两种,第一种对于出现在不同位置的相同子串算作一个子串

第二种,对于不同位置的子串算作是不相同子串

数据范围:

$1\leq |S| \leq5000 00$

分析:

对于第一种计算,endpos算作1,对于第二种,endpos是状态出现的次数

对于当前状态前缀出现的次数为endpos+子状态的出现次数

sam的拓扑序可以根据maxlen来排,maxlen越大,拓扑序肯定越小,无论是slink,还是trans边,都是短的maxlen链接长的maxlen

用桶排序实现$O(n)$为它们排序

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
typedef long long ll;
char S[N/2];
char ans[N/2];
int fla,k,top;
struct suffixautomation
{
int mp[N][30];int fa[N];int ed;int ct;int len[N];int siz[N];
ll weight[N];
int z[N],A[N];
suffixautomation(){ed=ct=1;}
inline void ins(int c,int pos)
{
int p=ed;siz[ed=++ct]=1;len[ed]=pos;//先初始化size和len
for(;p&&mp[p][c]==0;p=fa[p]){mp[p][c]=ed;}//然后顺着parent树的路径向上找
if(p==0){fa[ed]=1;return;}int q=mp[p][c];//case1
if(len[p]+1==len[q]){fa[ed]=q;return;}//case2
len[++ct]=len[p]+1;//case 3
for(int i=1;i<=26;i++){mp[ct][i]=mp[q][i];}
fa[ct]=fa[q];fa[q]=ct;fa[ed]=ct;
for(int i=p;mp[i][c]==q;i=fa[i]){mp[i][c]=ct;}
} void solve(){
//sort
for(int i=1;i<=ct;i++)z[len[i]]++;
for(int i=1;i<=ct;i++)z[i]+=z[i-1];
for(int i=1;i<=ct;i++)A[z[len[i]]--]=i; for(int i=ct;i>=1;i--){
if(fla)siz[fa[A[i]]]+=siz[A[i]];
else siz[fa[A[i]]]=1;
}
for(int i=ct;i>=1;i--){
// cout<<A[i]<<endl;
int v=A[i];
weight[v]=siz[v];
for(int j=1;j<=26;j++)
if(mp[v][j])weight[v]+=weight[mp[v][j]];
}
weight[1]-=siz[1];
if(k>weight[1]){
printf("-1\n");
return ;
}
int now=1;
while(1){
for(int i=1;i<=26;i++)
if(k>weight[mp[now][i]]){
k-=weight[mp[now][i]];
}else{
now=mp[now][i];
ans[++top]='a'+i-1;
break;
}
if(k<=siz[now])break;
else k-=siz[now];
}
ans[++top]=0;
printf("%s\n",ans+1);
}
}sam;
int main()
{
scanf("%s",S+1);
scanf("%d %d",&fla,&k);
int len=strlen(S+1);
for(int i=1;i<=len;i++)sam.ins(S[i]-'a'+1,i);
sam.solve();
return 0;
}

  

最新文章

  1. Objective-C中block的底层原理
  2. [WinAPI] API 10 [创建、打开、读写文件,获取文件大小]
  3. apache下virtualhost与location合用配置转发SVN控制访问
  4. Javascript 基础(二)
  5. 解决play framework play控制台乱码问题
  6. OC中的消息传递和初始化
  7. for xml path以及sql合并查询
  8. Java API —— Pattern类
  9. 【Java】Java运行cmd命令直接导出.sql文件
  10. 2014年度辛星css教程夏季版第三节
  11. Android状态栏颜色修改
  12. PropertiesDemo
  13. [编织消息框架][传输协议]sctp
  14. Yii2.0调用sql server存储过程并获取返回值
  15. IDEA与eclipse:vm参数调优笔记
  16. atom 的使用插件
  17. GetWindowRect和GetClientRect的注意事项
  18. consul-template + nginx部署高可用负载均衡
  19. 新购买的vps应该做的几件事情
  20. VIM 文件编码识别与乱码处理(转载)

热门文章

  1. netcore使用EFcore(第一个实例)
  2. python入门-windows下python环境搭建
  3. iOS - error:unrecognized selector sent to class 导入第三方SDK .a后不识别,运行崩溃
  4. http://go.microsoft.com/fwlink/?linkid问题
  5. axios配置及使用(发起请求时带上token)
  6. Bootstrap源码
  7. 等保测评中与oracle有关的工作
  8. idea+maven使用
  9. 在pivotal cloud foundry上申请账号和部署应用
  10. 探究Java如何实现原子操作(atomic operation)