后缀自动机+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 ;
}

最新文章

  1. Meteor + node-imap(nodejs) + mailparser(nodejs) 实现完整收发邮件
  2. 为网站文字前面添加图标 在线调用 Font Awesome 字体icon小图标 美化网站
  3. [C++] MyList&lt;T&gt;
  4. Oracle DBA从小白到入职实战应用
  5. hdu 4576 概率dp **
  6. Python标准库07 信号 (signal包,部分os包)
  7. Android反射出一个类中的其他类对象并调用其对应方法
  8. Prime Land
  9. .Net程序员学用Oracle系列(30):零碎补充、最后总结(The End)
  10. 【笔记】shellcode相关整理
  11. qt中线程的使用方法
  12. Struts 2 之文件上传
  13. freemarker导出word档
  14. java 反射获取方法返回值类型
  15. 更新windows补丁时一直卡在搜索更新
  16. 发布-订阅消息系统Kafka简介
  17. LeetCode: Next Permutation 解题报告
  18. Maintenance Planner calculate SPs by manual
  19. (转)mysql command line client打不开(闪一下消失)的解决办法
  20. HTTP协议详解之url与会话管理

热门文章

  1. Windows 10安装IntelliJ IDEA时快捷键冲突设置
  2. 新建mvc项目
  3. Word中将文本框、图形对象中的文本边距调整
  4. Android studio 导入githubproject
  5. 【剑指offer】异或去重
  6. UVA 1356 - Bridge(自适应辛普森)
  7. SQL server 数据存储过程
  8. UBUNTU安装PHP,即所谓得LAMP
  9. 使用Swift作为Glance后端存储
  10. js对象的属性问题