题目链接:点击查看

题目大意:给出一个字符串 s ,再给出 m 次询问,每次询问需要回答字符串中第 k 小的的子串(去重后)

题目分析:可以先对字符串 s 构造SAM,因为是去重后的子串,正好对应了SAM上的每个节点,所以我们可以在SAM上dfs统计每条路下面都还有多少条路可以走,以此作为每次查询时dfs的依据,之后按照字典序的状态遍历就好了

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e5+100;char s[N];int tot=1,last=1,cnt[N<<1];struct Node
{int ch[26];int fa,len;
}st[N<<1];void add(int x)
{int p=last,np=last=++tot;st[np].len=st[p].len+1;while(p&&!st[p].ch[x])st[p].ch[x]=np,p=st[p].fa;if(!p)st[np].fa=1;else{int q=st[p].ch[x];if(st[p].len+1==st[q].len)st[np].fa=q;else{int nq=++tot;st[nq]=st[q]; st[nq].len=st[p].len+1;st[q].fa=st[np].fa=nq;while(p&&st[p].ch[x]==q)st[p].ch[x]=nq,p=st[p].fa;//向上把所有q都替换成nq}}
}int dfs(int u)
{if(cnt[u])return cnt[u];cnt[u]=1;for(int i=0;i<26;i++){int v=st[u].ch[i];if(v){dfs(v);cnt[u]+=cnt[v];}}return cnt[u];
}void solve(int cur,int k,int len)
{k--;if(k==0){s[len]=0;puts(s);return;}for(int i=0;i<26;i++){int to=st[cur].ch[i];if(!to)continue;if(cnt[to]<k)k-=cnt[to];else{s[len]='a'+i;solve(to,k,len+1);return;}}
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);scanf("%s",s);int len=strlen(s);for(int i=0;i<len;i++)add(s[i]-'a');dfs(1);int m;scanf("%d",&m);while(m--){int k;scanf("%d",&k);solve(1,k+1,0);}return 0;
}

SPOJ - SUBLEX Lexicographical Substring Search(后缀自动机)相关推荐

  1. SP7258 SUBLEX - Lexicographical Substring Search(后缀自动机)

    传送门 解题思路 首先建\(sam\),然后在拓扑序上\(dp\)一下,把每个点的路径数算出来,然后统计答案时就在自动机上\(dfs\)一下,仿照平衡树那样找第\(k\)小. 代码 #include& ...

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

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

  3. spoj7258:Lexicographical Substring Search 后缀自动机

    经典题,找不重复字典序第kk小的字符串. 先跑出SAM,然后在SAM上DP. 因为从SAM的起点跑可以跑出所有的子串,所以我们用dpidp_i表示从ii点出发跑出的子串的个数,显然有 dpi=∑j=a ...

  4. 【luogu SP7258】SUBLEX - Lexicographical Substring Search

    SUBLEX - Lexicographical Substring Search 题目链接:luogu SP7258 题目大意 给你一个字符串,要你求字典序第 k 大的子串. (相同的子串算只一个) ...

  5. SPOJ 7258 Lexicographical Substring Search(后缀自动机)

    题目链接:http://www.spoj.com/problems/SUBLEX/ 题意:给定一个字符串,每次询问第K小的串. 思路:建立自动机.cnt[p]=sigama(cnt[son[p][i] ...

  6. SPOJ7258 SUBLEX - Lexicographical Substring Search

    传送门[洛谷] 心态崩了我有妹子 靠 我写的记忆化搜索 莫名WA了 然后心态崩了 当我正要改成bfs排序的时候 我灵光一动 md我写的i=0;i<25;i++??? 然后 改过来就A掉了T^T ...

  7. spoj7258 SUBLEX Lexicographical Substring Search

    http://www.elijahqi.win/archives/3001 题意翻译 给定一个字符串,求排名第k小的串 注意样例的\n是换行 输入格式: 第一行给定主串(len<=90000) ...

  8. SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机)【两种做法】

    SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机)[两种做法] 手动博客搬家: 本文发表于20181217 23:54:35, 原地址https: ...

  9. [SPOJ7258]Lexicographical Substring Search

    [SPOJ7258]Lexicographical Substring Search 试题描述 Little Daniel loves to play with strings! He always ...

最新文章

  1. my vim IDE 编辑器的配置
  2. Python拟合数据样本的分布
  3. 【BZOJ1086】[SCOI2005]王室联邦 树分块
  4. LoRa 之一 旧版驱动(sx12xxDrivers-V2.1.0)移植及驱动架构详解
  5. SAP Fiori里的List是如何做到懒加载Lazy load的
  6. 企业微信小程序_小程序开发工具及真机调试_host配置及代理
  7. 用SSE加速CPU蒙皮计算
  8. hadoop native安装
  9. elasticsearch 1.1.0 mmseg 英文数字分词
  10. 拓端tecdat|R语言逻辑回归和泊松回归模型对发生交通事故概率建模
  11. 央视推荐的护眼台灯是什么牌子?教育照明灯具品牌
  12. excel表格坐标导入cad怎样操作?
  13. dict.txt(上一个程序的文件)
  14. MJB,阿里又一次成功的营销?
  15. CSS 单(多)行文本超过部分显示省略号,解决数字或英文不换行问题
  16. 观光公交(codevs 1139)题解
  17. 高德百度地图如何获取附近小区酒店银行等?
  18. SparkSQL比MapReduce快的原因
  19. 疯狂Java讲义(五)----第一部分
  20. JTAG、SWD、JLINK、ST-LINK、ULINK的区别

热门文章

  1. kubernetes 容器内获取Pod信息(包括:宿主主机IP)
  2. mybatis反射的核心类
  3. Stream流终结操作方法
  4. Nacos安装和服务注册
  5. 在vs code中创建代码片段
  6. 注解_自定义注解_属性定义
  7. 练习_用if语句实现考试成绩划分
  8. MapReduce案例-wordcount-JobMain代码
  9. 基于jwt的用户鉴权:拦截器概述
  10. K8S之HELM详细介绍