经典题目:给一个字符串,求字典序第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. python爬虫之scrapy框架介绍

    一.什么是Scrapy? Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等) ...

  2. 为什么java代码中要避免多层深度for循环嵌套

    在开发中,一直强调代码的整洁和可读性.之前对于使用多层嵌套for循环,一直以为只是对代码可读性和逻辑梳理有影响.可能对性能也有影响,但是一直不知道对性能影响在哪.最近在看虚拟机方面的书,感觉有一个点应 ...

  3. HTML5上的LocalStorage基本用法

    1.获取localStorage的长度:window.localStorage.length 2.添加/编辑localStorage的内容:window.localStorage.setItem(键, ...

  4. 怎么使用Spring配置事务 ?

    Spring同时支持编程式事务策略和声明式事务策略,大部分时候都采用声明式事务策略. 声明式事务管理的配置方式,通常有以下4种: (1) 使用TransactionProxyFactoryBean为目 ...

  5. springmvc使用ajax进行数据交互时,session失效问题(@ResponseBody与session能否同时使用?)

    今天做博客demo的时候遇到了这样的问题:当我用ajax进行资源请求时,需要顺便将账户信息存入session.但是后来发现有@Responsebody标签时,直接用HttpSession存数据时,根本 ...

  6. Digitalocean + ss 搭建加密通信代理服务器

    本文以 DigitalOcean + ss/ssr 配置加密通道***为例,记录了手动搭梯子的过程. 启动一个服务器实例的操作可以参考我的这篇博文,这里主要介绍 ss/ssr 的服务搭建过程. 首先 ...

  7. Python基础系列讲解——继承派生和组合的概念剖析

    Python作为一门面向对象的语言,它的面向对象体系中主要存在这么两种关系,一个是“类”和“实例”的关系,另一个是“父类”和“子类”的关系. 所谓“类”是从一堆对象中以抽象的方式把相同的特征归类得到的 ...

  8. Virtual DOM的简单实现

    了解React的同学都知道,React提供了一个高效的视图更新机制:Virtual DOM,因为DOM天生就慢,所以操作DOM的时候要小心翼翼,稍微改动就会触发重绘重排,大量消耗性能. 1.Virtu ...

  9. React的setState分析

    前端框架层出不穷,不过万变不离其宗,就是从MVC过渡到MVVM.从数据映射到DOM,angular中用的是watcher对象,vue是观察者模式,react就是state了. React通过管理状态实 ...

  10. 北航MOOC系统Android客户端NABC

    北航MOOC手机客户端NABC分析 1) N (Need 需求) MOOC是Massive Open Online Course的缩写,通常被译为大型开放式网络课程,它最早在08年的时候由一位加拿大的 ...