经典题目:给一个字符串,求字典序第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;
}

  

转载于:https://www.cnblogs.com/lochan/p/3796405.html

SPOJ_SUBLEX相关推荐

  1. spoj SUBLEX (Lexicographical Substring Search) RE的欢迎来看看

    SPOJ.com - Problem SUBLEX 这么裸的一个SAM,放在了死破OJ上面就是个坑. 注意用SAM做的时候输出要用一个数组存下来,然后再puts,不然一个一个字符输出会更慢. 还有一个 ...

最新文章

  1. 基因组组装(Genome Assembly)
  2. maven指定构建的编码格式
  3. jenkins的安装
  4. 1001 害死人不偿命的(3n+1)猜想 (15分)
  5. 信息学奥赛一本通(1086:角谷猜想)
  6. linux软raid 系统坏了,LINUX下软RAID的制造及如何查看坏盘?
  7. 魔改部署自己专属的合成大西瓜(一:运行篇)
  8. Delphi2007的重构功能
  9. arcgis图像和坐标系统一致但不重合_分享∣Arcgis中62个常用技巧系列二(21-40技巧)...
  10. 两个HC05蓝牙模块相互之间的通信
  11. linux加密狗复制克隆教程,[求助]如何复制使用U盘做的加密狗
  12. 【一年总结】我的大三
  13. android平台的一款mud工具,全平台 MUD 客户端 TinTin++ 之安卓篇
  14. js 混合排序(同时存在数字、字母、汉字等)
  15. 命令行提示符参数PS1, 但是不会自动换行
  16. 操作系统之生产者与消费者
  17. Google Chrome浏览器出现:您目前无法访问 XX.XX.XX.XX,因为此网站发送了 Google Chrome 无法处理的杂乱凭据。
  18. MSE 均方误差及其梯度
  19. BigDecimal 往左移动两位小数_小学五年级上册数学小数除法应用题专项练习,拿给孩子做做看...
  20. DOTA版设计模式——命令

热门文章

  1. 2019年末逆向复习系列之努比亚Cookie生成逆向分析
  2. 使用gethostname()函数和gethostbyname()函数获取主机相关信息
  3. Linux Sendfile的优势
  4. 【项目管理和构建】——Maven简介(一)
  5. JSON学习笔记(六)- JSONP
  6. 快速搞懂ThreadLocal实现原理
  7. 基于Spark的Als算法+自迭代+Spark2.0新写法
  8. spark中flatMap函数用法
  9. 决策树基本原理与sklearn应用
  10. Java 8th 函数式编程:lambda 表达式