题目链接:

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;
}

  

P3975 (后缀自动机sort)的更多相关文章

  1. 后缀自动机求字典序第k小的串——p3975

    又领悟到了一点新的东西,后缀自动机其实可以分为两个数据结构,一个是后缀树,还有一个是自动机 后缀树用来划分endpos集合,并且维护后缀之间的关系,此时每个结点代表的是一些后缀相同且长度连续的子串 自 ...

  2. 洛谷 P3975 / loj 2102 [TJOI2015] 弦论 题解【后缀自动机】【拓扑排序】

    后缀自动机入门. 题目描述 为了提高智商,ZJY 开始学习弦论. 这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为 \(n\) 的字符串,求出它的第 \ ...

  3. 【洛谷 P3975】 [TJOI2015]弦论(后缀自动机)

    题目链接 建出后缀自动机. T=0,每个子串算一次,否则每个子串算该子串的\(endpos\)集合大小次. 用\(f[i]\)表示结点\(i\)表示的\(endpos\)集合大小,则\(f[i]\)为 ...

  4. HDU 4622 Reincarnation 后缀自动机

    模板来源:http://blog.csdn.net/zkfzkfzkfzkfzkfzkfzk/article/details/9669747 解法参考:http://blog.csdn.net/dyx ...

  5. HDU 4622 多校第三场1002 后缀自动机

    比赛的时候我是用后缀数组的,但是T了. 赛后看了解题报告说,后缀数组貌似是卡你常数的时间,我算了下复杂度O(T * Q * n).这是10 ^ 8,但是考虑到每次询问的时候都要重新构造字符,所以那个n ...

  6. hdu4622-Reincarnation(后缀自动机)

    Problem Description Now you are back,and have a task to do:Given you a string s consist of lower-cas ...

  7. 后缀自动机/回文自动机/AC自动机/序列自动机----各种自动机(自冻鸡) 题目泛做

    题目1 BZOJ 3676 APIO2014 回文串 算法讨论: cnt表示回文自动机上每个结点回文串出现的次数.这是回文自动机的定义考查题. #include <cstdlib> #in ...

  8. [模板] 后缀自动机&&后缀树

    后缀自动机 后缀自动机是一种确定性有限状态自动机, 它可以接收字符串\(s\)的所有后缀. 构造, 性质 翻译自毛子俄罗斯神仙的博客, 讲的很好 后缀自动机详解 - DZYO的博客 - CSDN博客 ...

  9. [十二省联考2019]字符串问题——后缀自动机+parent树优化建图+拓扑序DP+倍增

    题目链接: [十二省联考2019]字符串问题 首先考虑最暴力的做法就是对于每个$B$串存一下它是哪些$A$串的前缀,然后按每组支配关系连边,做一遍拓扑序DP即可. 但即使忽略判断前缀的时间,光是连边的 ...

随机推荐

  1. linux环境,hidraw设备自动加载时默认权限的设置方法

    在linux系统中,hidraw设备会自动加载并设置默认权限,但系统的默认只允许root用户访问,普通用户是不允许读写. 设置的方法是修改udev的配置,配置路径是/etc/udev/rules.d/ ...

  2. EfCore基本用法

    db first 和 code first的基本使用方法 https://www.cnblogs.com/Starts_2000/p/mysql-efcore20-codefirst-dbfirst- ...

  3. bootstrap tab选项卡

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  4. 如何使用Systemctl管理系统服务和单元?

    chu原文:How To Use Systemctl to Manage Systemd Services and Units 简书:如何使用Systemctl管理系统服务和单元? 引言 System ...

  5. RHEL/CentOS/Fedora各种源(EPEL、Remi、RPMForge、RPMFusion)

    参考:RHEL/CentOS/Fedora各种源(EPEL.Remi.RPMForge.RPMFusion)配置 简介 CentOS 默认自带 CentOS-Base.repo 源, 但官方源中去除了 ...

  6. Kubernetes 1.14发布:对Windows节点的生产级支持、Kubectl更新与持久本地卷通用版本已全面到来

    今天,我们高兴地宣布Kubernetes 1.14版本的正式亮相,这亦是我们在2019年当中进行的首次发布!Kubernetes 1.14版本由31项增强功能组成,具体包括:10项稳定版功能,12项b ...

  7. Dymola — 多学科系统仿真平台

            Dymola 是法国Dassault Systems公司的多学科系统仿真平台,广泛应用于国内外汽车.工业.交通.能源等行业的系统总体架构设计.指标分解以及系统功能验证及优化等.Dymo ...

  8. 基于Java+Selenium的WebUI自动化测试框架(七)--IE浏览器的设置

    在上一篇我们讲了关于WebDriver的版本,浏览器初始化,以及下载的设定. 在设置IE浏览器进行WebDriver的测试时,通常会遇见以下几种错误: 1.没有关闭IE浏览器的保护模式. 当运行测试用 ...

  9. linux网络编程之system v信号量(二)

    今天迎来元旦假期的最后一天了,过得好快~昨天跟小伙伴们在军都滑雪陪儿爽,虽说上了两回中级道都摔得异常的惨烈,但是在初级道上学习"s"转弯还是有一些小心得,可以在要往高手迈进的前提, ...

  10. 【搜索/tarjan找环】zznu-简单环路

    简单环路 题目描述 有一个N x M 大小的地图,地图中的每个单元包含一个大写字母. 若两个相邻的(这里的相邻指“上下左右”相邻)点上的字母相同,我们可以用线段连接这两个点. 若存在一个包含同一字母的 ...