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

关于相同子串算一个还是算多个,其实就是看一种状态的 right 集合是否加上 Parent 树中子树的 right 集合;

虽然是子串却不管 l 数组,因为实际上 dfs 走到一个点,得到的是一个确定的子串,而这个子串的状态属于这个点表示的状态,l 数组是这个点表示的状态数,当然不用考虑;

记一个 sum 表示这个状态往后加字母能得到的所有子串个数,然后在SAM上按字典序 dfs ,走过的边就是添加的字符。

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const xn=5e5+;
int T,K,fa[xn<<],l[xn<<],go[xn<<][],lst=,cnt=,siz[xn<<],sum[xn<<];
int tax[xn<<],t[xn<<];
char s[xn];
void add(int w)
{
int p=lst,np=++cnt; lst=np; l[np]=l[p]+; siz[np]=;
for(;p&&!go[p][w];p=fa[p])go[p][w]=np;
if(!p)fa[np]=;
else
{
int q=go[p][w];
if(l[q]==l[p]+)fa[np]=q;
else
{
int nq=++cnt; l[nq]=l[p]+;
memcpy(go[nq],go[q],sizeof go[q]);
fa[nq]=fa[q]; fa[q]=fa[np]=nq;
for(;go[p][w]==q;p=fa[p])go[p][w]=nq;
}
}
}
void Tsort()
{
for(int i=;i<=cnt;i++)tax[l[i]]++;
for(int i=;i<=cnt;i++)tax[i]+=tax[i-];
for(int i=;i<=cnt;i++)t[tax[l[i]]--]=i;
for(int i=cnt;i;i--)
{
int x=t[i];
if(T==)siz[x]=;
else siz[fa[x]]+=siz[x];
}
siz[]=;//
for(int i=cnt;i;i--)
{
int x=t[i]; sum[x]=siz[x];
for(int j=;j<;j++)
if(go[x][j])sum[x]+=sum[go[x][j]];
}
}
void dfs(int x,int s)
{
if(s<=siz[x])return;//<=
s-=siz[x];
for(int j=;j<;j++)
{
if(!go[x][j])continue;
if(s>sum[go[x][j]])s-=sum[go[x][j]];
else
{
putchar(j+'a');
dfs(go[x][j],s);
return;
}
}
}
int main()
{
scanf("%s",s+); int n=strlen(s+);
scanf("%d%d",&T,&K);
for(int i=;i<=n;i++)add(s[i]-'a');
Tsort(); dfs(,K); puts("");
return ;
}

bzoj 3998 弦论 —— 后缀自动机的更多相关文章

  1. BZOJ - 3998 弦论 (后缀自动机)

    #include<cstdio> #include<cstring> #include<queue> using namespace std; typedef lo ...

  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. Storm编程模型及Worker通信机制

    1.编程模型 2.Worker通信机制

  2. 【Robot Framework】---- Robot Framework简介、特点、RIDE

    Robot Framework简介.特点.RIDE 一.简介.特点. Robot Framework是一款python编写的功能自动化测试框架.具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型 ...

  3. [闲来无事,从头再来][C51篇]导读

    目       的:  通过学习C51,熟悉单片机,熟悉C语言,熟悉单片机系统的外部电路. 方       法:  通过看书和使用板子做实验来进行学习 参考资料: <新概念51单片机C语言教程& ...

  4. Python socket server demo

    #coding:utf-8 from socket import * #开启ip和端口 ip_port = ("192.168.1.103",8088) print ip_port ...

  5. HTML哪些是块级元素,哪些是行内元素、

    块级元素:块级大多为结构性标记 <address>...</adderss> <center>...</center>  地址文字 <h1> ...

  6. Kattis - triangle 【数学】

    题意 求第N个迭代三角形 中 所有黑色三角形的周长的整数部分的位数 思路 该三角形的周长是 3^(n + 1)/ 2 ^ (n) 然后 可以用 long double 存下来 再求位数 就可以 AC ...

  7. iOS NSDateFormatter 不安全线程 处理

    记得 上次我们开CodeReView大会 有人提出 "  NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];   ...

  8. virtualbox 桥接 (转)

    virtualbox 自带的网络配置模式要么选择host-only,要么bridge,对于经常使用virtualbox的同学一定想要像vmware一样的nat配置,既可以让host访问guest,又可 ...

  9. 【leetcode刷题笔记】Sort List

    Sort a linked list in O(n log n) time using constant space complexity. 题解:实现一个链表的归并排序即可.主要分为三部分: 1.找 ...

  10. MySQL跳过密码登录

    第一种 1.1停止mysql服务 1.2以管理员身份运行cmd,执行以下命令 cd C:\Program Files\mysql-5.7.17-winx64\bin mysqld --skip-gra ...