首页 技术 正文
技术 2022年11月15日
0 收藏 470 点赞 3,635 浏览 1433 个字

后缀自动机+dp

想了挺长时间

后缀自动机的状态图是一个dag,从root走到一个点的路径数代表了这个状态包含的子串,我们先预处理出来每个节点向后走能够形成多少子串,注意这里不是直接在parent树上求和,我们先求出每个节点的right集合的大小,然后在状态图上统计儿子的路径数,因为向儿子走相当于添加一个字符,所以这里和Max没有关系,那么图上后继的Right和就是之后能够形成多少子串,然后就是查找第k大的过程了。这道题T=0的时候每个点的值都是1,因为相同的算一个,T=1就是Right集合的大小。

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + ;
int n, k, T;
int a[N], c[N], sum[N], val[N];
char s[N];
namespace SAM
{
struct node {
int val, par;
int ch[];
} t[N];
int last = , root = , sz = ;
int nw(int x)
{
t[++sz].val = x;
return sz;
}
void extend(int c)
{
int p = last, np = nw(t[p].val + );
val[np] = ;
while(p && !t[p].ch[c]) t[p].ch[c] = np, p = t[p].par;
if(!p) t[np].par = root;
else
{
int q = t[p].ch[c];
if(t[q].val == t[p].val + ) t[np].par = q;
else
{
int nq = nw(t[p].val + );
memcpy(t[nq].ch, t[q].ch, sizeof(t[q].ch));
t[nq].par = t[q].par;
t[q].par = t[np].par = nq;
while(p && t[p].ch[c] == q) t[p].ch[c] = nq, p = t[p].par;
}
}
last = np;
}
void RadixSort()
{
for(int i = ; i <= sz; ++i) ++c[t[i].val];
for(int i = ; i <= sz; ++i) c[i] += c[i - ];
for(int i = ; i <= sz; ++i) a[c[t[i].val]--] = i;
for(int i = sz; i; --i)
{
int u = a[i];
if(T == ) val[u] = ;
else val[t[u].par] += val[u];
}
val[] = ;
for(int i = sz; i; --i)
{
int u = a[i];
sum[u] = val[u];
for(int j = ; j < ; ++j) if(t[u].ch[j])
sum[u] += sum[t[u].ch[j]];
}
}
void print(int u)
{
if(k <= val[u]) return;
k -= val[u];
for(int i = ; i < ; ++i) if(t[u].ch[i])
{
if(k <= sum[t[u].ch[i]])
{
printf("%c", 'a' + i);
print(t[u].ch[i]);
return;
}
else k -= sum[t[u].ch[i]];
}
}
} using namespace SAM;
int main()
{
scanf("%s%d%d", s + , &T, &k);
n = strlen(s + );
for(int i = ; i <= n; ++i) extend(s[i] - 'a');
RadixSort();
if(sum[] < k)
{
puts("-1");
return ;
}
print(root);
return ;
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,082
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,556
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,406
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,179
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,815
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,898