博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 3998: [TJOI2015]弦论 后缀自动机
阅读量:5078 次
发布时间:2019-06-12

本文共 2159 字,大约阅读时间需要 7 分钟。

题目大意:

对于一个给定长度为N的字符串,求它的第K小子串是什么。

题解:

这道题我们可以类比着来做

那道题是求最小的一个字符串,而这道题是要求一个k小的字符串

所以我们瞎搞一搞就好了啊...像在平衡树上查询k小一样.

#include 
#include
#include
using namespace std;typedef long long ll;inline void read(ll &x){ x=0;char ch;bool flag = false; while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true; while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;}const ll maxn = 500010;struct Node{ int nx[26]; int fa,len;}T[maxn<<1];int last,nodecnt;ll siz[maxn<<1];int num[maxn<<1];void init(){ last = nodecnt = 0; T[0].fa = -1;T[0].len = 0;}void insert(char cha){ int c = cha - 'a',cur = ++ nodecnt,p; T[cur].len = T[last].len+1; for(p=last;p!=-1 && !T[p].nx[c];p=T[p].fa) T[p].nx[c] = cur; if(p == -1) T[cur].fa = 0; else{ int q = T[p].nx[c]; if(T[q].len == T[p].len + 1) T[cur].fa = q; else{ int co = ++ nodecnt; T[co] = T[q];T[co].len = T[p].len + 1; for(;p!=-1&&T[p].nx[c] == q;p=T[p].fa) T[p].nx[c] = co; T[cur].fa = T[q].fa = co; } }last = cur; ++num[last];}inline void build(char *s){ init();int len = strlen(s); for(int i=0;i
=1;--i){ if(ty == 0) num[q[i]] = (bool)num[q[i]]; num[T[q[i]].fa] += num[q[i]]; }}void dfs(int u){ vis[u] = true; siz[u] = num[u]; for(int c=0;c<26;++c){ if(T[u].nx[c]){ if(!vis[T[u].nx[c]]) dfs(T[u].nx[c]); siz[u] += siz[T[u].nx[c]]; } }return;}bool flag = false;void find(int u,ll k){ if(k <= num[u]) return; k -= num[u]; for(int c=0;c<26;++c){ if(T[u].nx[c]){ if(k <= siz[T[u].nx[c]]){ flag = true; putchar(c+'a'); find(T[u].nx[c],k); return; }k -= siz[T[u].nx[c]]; } }return;}char s[maxn<<1];int main(){ scanf("%s",s);build(s); ll T,K;read(T);read(K); calc_num(T);memset(vis,0,sizeof vis); num[0] = 0;dfs(0); if(siz[0] < K) return puts("-1"); find(0,K); getchar();getchar(); return 0;}

转载于:https://www.cnblogs.com/Skyminer/p/6522905.html

你可能感兴趣的文章
redis集群如何清理前缀相同的key
查看>>
Python 集合(Set)、字典(Dictionary)
查看>>
获取元素
查看>>
proxy写监听方法,实现响应式
查看>>
第一阶段冲刺06
查看>>
十个免费的 Web 压力测试工具
查看>>
EOS生产区块:解析插件producer_plugin
查看>>
mysql重置密码
查看>>
jQuery轮 播的封装
查看>>
一天一道算法题--5.30---递归
查看>>
JS取得绝对路径
查看>>
排球积分程序(三)——模型类的设计
查看>>
python numpy sum函数用法
查看>>
php变量什么情况下加大括号{}
查看>>
linux程序设计---序
查看>>
【字符串入门专题1】hdu3613 【一个悲伤的exkmp】
查看>>
C# Linq获取两个List或数组的差集交集
查看>>
HDU 4635 Strongly connected
查看>>
ASP.NET/C#获取文章中图片的地址
查看>>
Spring MVC 入门(二)
查看>>