经典题目:给一个字符串,求字典序第k小的子串是什么。

涉及子串问题,上自动机。

首先我们可以用记忆化搜索的方法,求出到达某一个状态后,能产生多少个新状态。

首先,到达这个状态就不走了,这肯定是一种状态,然后分别考虑后面的26个指针就好了。

不过如果不记忆化肯定是要T的,而且如果用dp好像会有一点问题,因为状态转移不是严格的满足小号点到大号点(nq点啦)。

然后就是赤果果的dfs就可以啦。

对了还有一个有趣的事情,一开始我输出字符的地方T了,后来改变字符串的输出方式,然后就A了。spoj真是奇葩呀。能买个好点服务器吗?

召唤代码君:

#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 222222
using namespace std; int next[maxn][26],pre[maxn],step[maxn],f[maxn];
char s[maxn];
int N,last,n,k;
int p,q,np,nq; void insert(int x,int m)
{
p=last,np=++N,step[np]=m;
while (p!=-1 && next[p][x]==0) next[p][x]=np,p=pre[p];
last=np;
if (p==-1) return;
q=next[p][x];
if (step[q]==step[p]+1) { pre[np]=q; return; }
nq=++N,step[nq]=step[p]+1,pre[nq]=pre[q];
for (int i=0; i<26; i++) next[nq][i]=next[q][i];
pre[np]=pre[q]=nq;
for (;p!=-1 && next[p][x]==q; p=pre[p]) next[p][x]=nq;
} int get(int x)
{
if (f[x]!=0) return f[x];
f[x]=1;
for (int i=0; i<26; i++) if (next[x][i]) f[x]+=get(next[x][i]);
return f[x];
} void output(int pos,int num,int L)
{
num--;
if (num==0)
{
s[L]='\0';
printf("%s\n",s+1);
return;
}
for (int i=0; i<26; i++)
{
if (next[pos][i]==0) continue;
if (f[next[pos][i]]<num) num-=f[next[pos][i]];
else
{
s[L]='a'+i;
output(next[pos][i],num,L+1);
return;
}
}
} int main()
{
pre[0]=-1;
scanf("%s",s);
for (int i=0; s[i]; i++) insert(s[i]-'a',i+1);
f[0]=get(0);
scanf("%d",&n);
while (n--)
{
scanf("%d",&k);
output(0,k+1,1);
}
return 0;
}

  

SPOJ_SUBLEX的更多相关文章

随机推荐

  1. c# url链接转成二维码图片,再转成byte[]二进制流,输出到前段ajax

    需要用到的 dll 添加引用 代码: //获取配置文件设置的url string urllink = ConfigurationManager.AppSettings["urllink&qu ...

  2. JavaScript 数组——filter()、map()、some()、every()、forEach()、lastIndexOf()、indexOf()

    filter():   语法: var filteredArray = array.filter(callback[, thisObject]); 参数说明: callback: 要对每个数组元素执行 ...

  3. Mkdir方法

    新建目录或文件夹. 语法 MkDir 路径 所需的_路径_参数是一个字符串表达式,标识的目录或文件夹创建. _路径_可以包含驱动器. 如果未指定驱动器, MkDir当前的驱动器上创建新目录或文件夹. ...

  4. hdu1272小希的迷宫(并查集判断回路和是否连通)

    传送门 迷宫中不能有回路,还要连通 如果最后集合数是一个那就是连通,否则不联通 要合并的两个顶点在相同集合内,表示出现了回路 输入时注意一下 #include<bits/stdc++.h> ...

  5. Jmeter接口测试(五)变量及参数化

    在请求过程中,有时我们需要在请求中设置一些变量来测试不同的场景. 提示:在调试请求过程中,无关的请求可以暂时禁用掉,选择某个暂时不用的请求,右键--禁用 Jmeter 支持以下类型变量:所有类型的变量 ...

  6. Shader开发之烘焙Lightmap自发光

    自己参考Build-in写了一套shader, 写完发现自发光部分在烘焙时不生效, 查阅资料发现需要在Material上设置为对应标记, 这部分功能可以像Standard Shader一样写在Shad ...

  7. SQLAlchemy并发写入引发的思考

    背景 近期公司项目中加了一个积分机制,用户登录签到会获取登录积分,但会出现一种现象就是用户登录时会增加双倍积分,然后生成两个积分记录.此为问题  问题分析 项目采用微服务架构,下图为积分机制流程   ...

  8. Spring Data REST PATCH请求远程代码执行漏洞(CVE-2017-8046) 本地复现方法

      #1背景 Spring Data REST是Spring Data项目的一部分,可以轻松地在Spring Data存储库之上构建超媒体驱动的REST Web服务. 恶意的PATCH请求使用精心构造 ...

  9. linux 其他知识目录

    博客目录总纲首页 为博客园添加目录的方法总结 linux 命令自动补全包 手动配置网卡 nginx日志统计 Linux 深入理解inode/block/superblock /proc/sys目录下各 ...

  10. NIO中的Buffer

    public abstract class Buffer { // Invariants: mark <= position <= limit <= capacity private ...