#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
const int N=1e6+,M=;
char s[N],s2[N];
int n,f,k;
struct SAM {
int go[N][M],pre[N],mxl[N],c[N],ss[N],tot,last,siz[N],sum[N],vis[N],mx;
void init() {last=tot=; newnode(); pre[]=-;}
int newnode(int l) {
int u=tot++;
memset(go[u],,sizeof go[u]);
mxl[u]=l,siz[u]=;
return u;
}
void add(int ch) {
int p=last,np=last=newnode(mxl[p]+);
siz[np]=;
for(; ~p&&!go[p][ch]; p=pre[p])go[p][ch]=np;
if(!~p)pre[np]=;
else {
int q=go[p][ch];
if(mxl[q]==mxl[p]+)pre[np]=q;
else {
int nq=newnode(mxl[p]+);
memcpy(go[nq],go[q],sizeof go[nq]);
pre[nq]=pre[q],pre[q]=pre[np]=nq;
for(; ~p&&go[p][ch]==q; p=pre[p])go[p][ch]=nq;
}
}
}
void build(char* s,int n) {init(); for(int i=; i<n; ++i)add(s[i]-'a');}
void toposort() {
for(int i=; i<tot; ++i)c[i]=;
for(int i=; i<tot; ++i)++c[mxl[i]];
for(int i=; i<tot; ++i)c[i]+=c[i-];
for(int i=; i<tot; ++i)ss[--c[mxl[i]]]=i;
}
void getsiz() {
for(int i=tot-; i>; --i)siz[pre[ss[i]]]+=siz[ss[i]];
siz[]=;
}
void getsum() {
for(int i=; i<tot; ++i)sum[i]=siz[i];
for(int i=tot-; i>=; --i)
for(int j=; j<M; ++j)if(go[ss[i]][j])sum[ss[i]]+=sum[go[ss[i]][j]];
}
void qry(int u,int k) {
int dep;
for(dep=; k>siz[u]; ++dep) {
k-=siz[u];
for(int i=; i<M; ++i) {
int v=go[u][i];
if(!v)continue;
if(k<=sum[v]) {s2[dep]=i+'a',u=v; break;}
k-=sum[v];
}
}
s2[dep]=,puts(s2);
}
void run() {
build(s,n);
toposort();
if(f)getsiz();
else {for(int i=; i<tot; ++i)siz[i]=; siz[]=;}
getsum();
if(sum[]<k)puts("-1");
else qry(,k);
}
} sam;
int main() {
scanf("%s%d%d",s,&f,&k),n=strlen(s);
sam.run();
return ;
}

BZOJ - 3998 弦论 (后缀自动机)的更多相关文章

  1. bzoj 3998 弦论 —— 后缀自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3998 关于相同子串算一个还是算多个,其实就是看一种状态的 right 集合是否加上 Pare ...

  2. BZOJ 3998: [TJOI2015]弦论 后缀自动机 后缀自动机求第k小子串

    http://www.lydsy.com/JudgeOnline/problem.php?id=3998 后缀自动机应用的一个模板?需要对len进行一个排序之后再统计每个出现的数量,维护的是以该字符串 ...

  3. BZOJ 3998 TJOI2015 弦论 后缀自动机+DAG上的dp

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3998 题意概述:对于一个给定长度为N的字符串,求它的第K小子串是什么,T为0则表示不同位置 ...

  4. BZOJ 3998 [TJOI2015]弦论 ——后缀自动机

    直接构建后缀自动机. 然后. 然后只需要再后缀自动机的go树上类似二分的方法进行查找即可,实际上是“26分”. 然后遇到了处理right集合的问题,然后觉得在go和parent树上上传都是可以的,毕竟 ...

  5. 【BZOJ-3998】弦论 后缀自动机

    3998: [TJOI2015]弦论 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2018  Solved: 662[Submit][Status] ...

  6. 【BZOJ3998】[TJOI2015]弦论 后缀自动机

    [BZOJ3998][TJOI2015]弦论 Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T ...

  7. BZOJ 2882: 工艺( 后缀自动机 )

    把串S复制成SS然后扔进后缀自动机里, 从根选最小的儿子走, 走N步就是答案了...一开始还想写个treap的...后来觉得太麻烦..就用map了... ----------------------- ...

  8. [bzoj3998][TJOI2015]弦论-后缀自动机

    Brief Description 给定一个字符串, 您需要求出他的严格k小子串或非严格k小子串. Algorithm Design 考察使用后缀自动机. 首先原串建SAM, 然后如果考察每个状态代表 ...

  9. bzoj 3277 & bzoj 3473,bzoj 2780 —— 广义后缀自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3277 https://www.lydsy.com/JudgeOnline/problem.p ...

随机推荐

  1. redhat下配置SEED DVS6446开发环境2

    ---恢复内容开始--- 1.rpcbind步骤  linux包:portmap安装包 libgssglue-0.1-8.1.el6.i686.rpm libtirpc-0.2.1-1.el6.i68 ...

  2. 三十八:数据库之ORM层面删除数据的注意事项

    准备工作 from sqlalchemy import create_engine, Column, Integer, String, Float, Text, ForeignKeyfrom sqla ...

  3. Python 的 Collection 库

    Collections 是 Python 内建的一个集合模块,提供了许多额外的数据类型. namedtuple namedtuple 主要用来生成可以使用名称来访问元素的数据对象,通常用来增强代码的可 ...

  4. 2D轮播图

    目录结构 index.html <!DOCTYPE html><html lang="en"><head> <meta charset=& ...

  5. Shell编程、part2

    本节内容 1. shell变量简介 2. 定义变量 3. 使用变量 4. 修改变量的值 5. 单引号和双引号的区别 6. 将命令的结果赋值给变量 7. 删除变量 8. 变量类型 9. 特殊变量列表 1 ...

  6. 一本值得你反复研读的Python佳作《Python编程从0到1》

    现在的Python入门书太多太多了,究竟如何选择呢? 当然选最好的最入门的讲解最清晰的,没有那么多废话的. 现在就推荐一本<Python编程从0到1>,还带视频的,到时候跟大家一起学习沟通 ...

  7. dos2unix Linux解决编写脚本出现“%0D

    ## Linux解决编写脚本出现“%0D”# 安装# yum install -y dos2unix# 然后进行转化一下脚本,将其中的install_mysql.sh换成你的脚本# dos2unix ...

  8. Spring Boot 2.0 多数据源编程

    多数据源配置 创建一个Spring配置类,定义两个DataSource用来读取application.properties中的不同配置.如下例子中,主数据源配置为spring.datasource.p ...

  9. numpy伪随机数的生成

    numpy伪随机数的生成 normal函数 可以用normal来得到一个标准正态分布的4×4样本数组 >>> import numpy as np >>> samp ...

  10. adb 打印kernel输出的log

     一. linux 内核printk机制     1.1. Android内核是基于Linxu kernel的,因此其log机制也是通用的,在Android内核中使用printk函数进行Log输出.与 ...