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

相同子串算多个的话,先求好 right ,然后求一个 sm 表示走到这个点之后有几种走法,即把 DAG 上自己能走到的点的 right 都收集起来,可用拓扑序解决。

相同子串算一个的话,给 DAG 上每个节点都赋上一个1,表示走到那个节点的话算一个子串;然后把 DAG 上自己能走到的点的1都收集起来。

然后可按字典序 dfs 这个 DAG ,如果 k 在这个分支里的话就走进去,否则 k -= sm[ ] ,然后看别的分支。

不用管 len[ ] ,因为 len[ ] 表示自己这个点管辖的许多子串,但如果自己是 dfs 地走过来,就只对应了其中一个子串,所以只用管 right 就行了。

之所以相同子串算一个的话要给复制出来的那些 nq 也赋一个1,是因为 nq 只是分了一些 q 管辖的子串;如果自己 dfs 着本应走到 q 点,但因为 nq 分管了一些而走到了 nq 点的话,自己也算走到了一个子串结尾的位置(1个而不是len个),所以应该计数1。

注意用 a[ i ] 而不是 i 。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=5e5+,M=1e6+,K=;
int lst=,cnt=,go[M][K],fa[M],l[M],rt[M];ll sm[M];
int tx[N],a[M];
char ch[N];
void add(int w)
{
int p=lst,np=++cnt;lst=np;l[np]=l[p]+;rt[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]+;
fa[nq]=fa[q];fa[q]=nq;fa[np]=nq;
memcpy(go[nq],go[q],sizeof go[q]);
for(;go[p][w]==q;p=fa[p])go[p][w]=nq;
}
}
}
void Rsort(int n,bool T)
{
for(int i=;i<=cnt;i++)tx[l[i]]++;
for(int i=n-;i>=;i--)tx[i]+=tx[i+];
for(int i=cnt;i;i--)a[tx[l[i]]--]=i;
for(int i=;i<=cnt;i++)
{
int d=a[i];
if(!T)rt[d]=;
else rt[fa[d]]+=rt[d];
}
// if(T)for(int i=1;i<=cnt;i++)rt[fa[a[i]]]+=rt[a[i]];//if()!!!!///a[]!!!!!!
for(int i=;i<=cnt;i++)
{
int d=a[i];///
sm[d]=rt[d];
for(int j=;j<=;j++)
if(go[d][j])
{
sm[d]+=sm[go[d][j]];
}
}
rt[]=;//
}
int main()
{
scanf("%s",ch);int n=strlen(ch);
for(int i=;i<n;i++)add(ch[i]-'a'+);
int T,k; scanf("%d%d",&T,&k);
Rsort(n,T);
int cr=;
bool flag=;
while()
{
if(rt[cr]>=k)break;
k-=rt[cr]; int ycr=cr;
for(int i=,d;i<=;i++)
if(sm[d=go[cr][i]]>=k)
{putchar(i+'a'-);cr=d;break;}
else k-=sm[d];
if(cr==ycr){printf("-1");break;}
}
return puts("");
}

最新文章

  1. [转]浏览器退出之后php还会继续执行么?
  2. Sublime文本排序&amp;查找重复行&amp;删除重复行
  3. SharePoint 2013 同步FBA认证用户
  4. javascript设计模式与开发实践阅读笔记(8)——观察者模式
  5. http 响应码
  6. CentOS6.5安装iftop
  7. Hadoop日记Day1---Hadoop介绍
  8. poj3177--Redundant Paths(边的双连通)
  9. WordPress Complete Gallery Manager插件‘upload-images.php’任意文件上传漏洞
  10. 轻量级的原型设计工具-Axure RP
  11. POJ 1734 Sightseeing trip
  12. vsftp关于&quot;550 create directory operation failed&quot;问题解决
  13. char、varchar、varchar(2)的区别
  14. ruby1.9.2 +windowxp
  15. python3 进一步了解装饰器 NLP第四条
  16. 借助FreeHttp任意篡改http报文 (使用&#183;实现)
  17. RabbitMQ 消息流程、AMOP 概念
  18. win32gui.Findwindow(parm1,parm2)查找窗口的句柄方法
  19. 图解JAVA参数传递
  20. 2010年腾讯前端面试题学习(js部分)

热门文章

  1. session的活化与钝化 (转)
  2. Bellman-Ford算法 - 有向图单源最短路径
  3. 拖拽窗口的实现-JQuery实现;
  4. uva 10125 二分
  5. ThinkPHP之MVC简析
  6. HTML 中 id与name 区别
  7. Struts03---参数传递
  8. Django框架(三)
  9. Android性能优化系列总篇
  10. 如何在win7下装ubuntu雙系統