博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spoj SUBLEX - Lexicographical Substring Search
阅读量:5344 次
发布时间:2019-06-15

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

Dicription

Little Daniel loves to play with strings! He always finds different ways to have fun with strings! Knowing that, his friend Kinan decided to test his skills so he gave him a string S and asked him Q questions of the form:

If all distinct substrings of string S were sorted lexicographically, which one will be the K-th smallest?

After knowing the huge number of questions Kinan will ask, Daniel figured out that he can't do this alone. Daniel, of course, knows your exceptional programming skills, so he asked you to write him a program which given S will answer Kinan's questions.
Example:

S = "aaa" (without quotes)
substrings of S are "a" , "a" , "a" , "aa" , "aa" , "aaa". The sorted list of substrings will be:
"a", "aa", "aaa".

 

Input

In the first line there is Kinan's string S (with length no more than 90000 characters). It contains only small letters of English alphabet. The second line contains a single integer Q (Q <= 500) , the number of questions Daniel will be asked. In the next Q lines a single integer K is given (0 < K < 2^31).

Output

Output consists of Q lines, the i-th contains a string which is the answer to the i-th asked question.

Example

Input: aaa 2 2 3 Output:aa aaa

Edited: Some input file contains garbage at the end. Do not process them.

 

 

建个后缀自动机之后,记录一下每个节点能到的节点数,然后询问的时候一遍dfs就行了。

#include
#include
#include
#include
#include
#include
#define ll long long#define maxn 400005using namespace std;int f[maxn],ch[maxn][26];int l[maxn],siz[maxn],n;int m,q,pre=1,cnt=1,rt[maxn];int a[maxn],c[maxn],tot[maxn];char s[maxn];inline void ins(int x,int y){ int p=pre,np=++cnt; pre=np,l[np]=l[p]+1; rt[np]=y+1; for(;p&&!ch[p][x];p=f[p]) ch[p][x]=np; if(!p) f[np]=1; else{ int q=ch[p][x]; if(l[q]==l[p]+1) f[np]=q; else{ int nq=++cnt; l[nq]=l[p]+1; memcpy(ch[nq],ch[q],sizeof(ch[q])); f[nq]=f[q]; f[q]=f[np]=nq; for(;ch[p][x]==q;p=f[p]) ch[p][x]=nq; } }}void dfs(int x){ tot[x]=siz[x]=1; for(int i=0;i<26;i++) if(ch[x][i]){ if(!siz[ch[x][i]]) dfs(ch[x][i]); tot[x]+=tot[ch[x][i]]; }}inline void build(){ n=strlen(s); for(int i=0;i
=0;i--) c[i]+=c[i+1]; for(int i=1;i<=cnt;i++) a[c[l[i]]--]=i; for(int i=1;i<=cnt;i++){ int now=a[i]; rt[f[now]]=max(rt[f[now]],rt[now]); } dfs(1);// for(int i=1;i<=cnt;i++) cout<
<<' '<
<

  

转载于:https://www.cnblogs.com/JYYHH/p/8461531.html

你可能感兴趣的文章
安卓day34内容提供者
查看>>
bitset
查看>>
jQuery最佳实践
查看>>
SELinux FAQ
查看>>
Java中synchronized同步的理解
查看>>
自己总结的C#编码规范--4.注释篇
查看>>
关于企业的薪酬体系之思考
查看>>
[nodejs]Buffer vs String
查看>>
python 数值计算库
查看>>
java 服务重启 js 中被注释代码仍然执行
查看>>
我并不是不闻不问![C#]
查看>>
插件大全网址
查看>>
ABAP EXCEL数据上传时因为栏位字符串过长而被截断的问题解决方法
查看>>
Linux 的基本操作(文件与目录管理)
查看>>
LeetCode 9. Palindrome Number
查看>>
python——排序
查看>>
同时使用Binding&StringFormat 显示Text【项目】
查看>>
过拟合与欠拟合 之原因和解决方法
查看>>
关于deepin上谷歌浏览器会出现延时的问题
查看>>
web前端经典小题
查看>>