传送门


Problem

对于一个给定的长度为 nnn 的字符串,求出它的第 kkk 小子串。

还有一个参数 ttt,ttt 为 000 则表示不同位置的相同子串算作一个,ttt 为 111 则表示不同位置的相同子串算作多个。


Solution

我们令 SizeiSize_iSizei​ 为 parent_tree\mathrm {parent\_tree}parent_tree 上 iii 子树的节点个数(除去克隆点)。

SizeiSize_iSizei​ 有一个性质,即 SizeiSize_iSizei​ 与 iii 所在的终点等价类的 endpos\mathrm{endpos}endpos 集合大小相等。

因此当 t=1t=1t=1 时 SizeiSize_iSizei​ 保持不变,t=0t=0t=0 时将每个 SizeiSize_iSizei​ 设为 111(代表只算一次)。

于是我们就可以通过 SizeSizeSize 求出子串的总数,从而用试填发法的思想确定第 kkk 小字符串。


Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1000005
#define ll long long
using namespace std;
char S[N];
int l,t,last,tot;
int A[N],Size[N];
ll k,sum[N];
struct SAM{int len,link,nxt[30];
}a[N<<1];
void Insert(int c){int p,cur=++tot;a[cur].len=a[last].len+1,Size[cur]=1;for(p=last;p!=-1&&!a[p].nxt[c];p=a[p].link)  a[p].nxt[c]=cur;if(p==-1)  a[cur].link=0;else{int now=a[p].nxt[c];if(a[now].len==a[p].len+1)a[cur].link=now;else{int Clone=++tot;a[Clone]=a[now],a[Clone].len=a[p].len+1;for(;p!=-1&&a[p].nxt[c]==now;p=a[p].link)a[p].nxt[c]=Clone;a[cur].link=a[now].link=Clone;}}last=cur;
}
void solve(int x,int k){if(k<=Size[x])  return;k-=Size[x];for(int i=0;i<26;++i){int to=a[x].nxt[i];if(!to)  continue;if(k>sum[to])  {k-=sum[to];continue;}putchar(i+'a'),solve(to,k);return;}
}
int main(){a[0].link=-1;scanf("%s%d%lld",S+1,&t,&k);int i,j,l=strlen(S+1);for(i=1;i<=l;++i)  Insert(S[i]-'a');for(i=1;i<=tot;++i)  sum[a[i].len]++;for(i=1;i<=tot;++i)  sum[i]+=sum[i-1];for(i=1;i<=tot;++i)  A[sum[a[i].len]--]=i;for(i=tot;i>=0;--i)(t?(Size[a[A[i]].link]+=Size[A[i]]):(Size[A[i]]=1)),sum[A[i]]=Size[A[i]];sum[0]=Size[0]=0;for(i=tot;i>=0;--i)for(j=0;j<26;++j)if(a[A[i]].nxt[j])sum[A[i]]+=sum[a[A[i]].nxt[j]];if(sum[0]<k)  puts("-1");else  solve(0,k);return 0;
}

【TJOI 2015】弦论相关推荐

  1. TJOI 2015 弦论 题解

    题目传送门 题目大意: 求出一个字符串第 kkk 小的子串是谁. 题解 建出SAM,求出 sizesizesize 数组,即每个状态的 endposendposendpos 集大小,如果 t=0t=0 ...

  2. 中微子超光速_定制中微子皮棉

    中微子超光速 Last week my friend Eli Perelman shared Modern JavaScript Apps with Neutrino, an awesome new ...

  3. 让我们聊聊聊天机器人

    介绍(Introduction) While surfing a website, you must have come across a popup with an image of a perso ...

  4. loj2058 「TJOI / HEOI2016」求和 NTT

    loj2058 「TJOI / HEOI2016」求和 NTT 链接 loj 思路 \[S(i,j)=\frac{1}{j!}\sum\limits_{k=0}^{j}(-1)^{k}C_{j}^{k ...

  5. 龙岩学院计算机二级报名时间,福建龙岩学院2015年12月计算机等级考试报名通知...

    福建龙岩学院2015年12月计算机等级考试报名通知 各学院: 根据上级有关文件通知,2015年12月福建省高校学生计算机应用水平等级考试开始报名,现将有关事项通知如下: 一.考试内容: 本次一.二考试 ...

  6. 浙江大学通信与计算机网络,新浙大2015年通信与计算机网络离线作业.doc

    新浙大2015年通信与计算机网络离线作业 浙江大学远程教育学院 <通讯与计算机网络>课程作业 姓名:学 号:年级:14年春学习中心:温州学习中心 从资源共享的角度来定义计算机网络,计算机网 ...

  7. 计算机一级考试模拟题函数,2015年计算机一级考试模拟题(四)

    2015年计算机一级考试模拟题(四) 请用Word 2003对考生文件夹下WORD.DOC文档中的文字进行编辑.排版和保存,具体要求如下: (1)将标题段("十年后的家电")文字设 ...

  8. CV算法复现(分类算法5/6):ResNet(2015年 微软亚洲研究院)

    致谢:霹雳吧啦Wz:https://space.bilibili.com/18161609 目录 致谢:霹雳吧啦Wz:https://space.bilibili.com/18161609 1 本次要 ...

  9. mysql如何下载连接到visual_Visual Studio 2015 Community连接到Mysql

    Visual Studio 2015 Community连接到MySQL,步骤很简单,但刚弄的时候一脸懵,现在记录如下以作备忘: 安装好VS2015和Mysql后,只需要再安装两个东西即可. 一个是S ...

最新文章

  1. linux内核添加c代码,如何从C代码加载Linux内核模块?
  2. linux怎么创建牡蛎_文件amp;目录小技巧 | Linux后门系列
  3. 史上最纯洁的女孩,看到我实在被雷到了。
  4. WIN7 64位系统搭建WINCE6.0系统遇到的问题
  5. mme设备内部错误_防爆电气设备安装的三大误区 你中招了没?
  6. HTML中的function函数命名,请问HTML function函数怎么定义和调用?
  7. JQuery--使用autocomplete控件进行自己主动输入完毕(相当于模糊查询)
  8. 配置sharepoint的在多个域环境中的kerberos认证
  9. 雷军:我爱编程这个工作,可以肯定我会干上一辈子
  10. 罗格斯大学计算机科学排名,罗格斯大学计算机工程硕士专业排名读完这篇立即秒懂...
  11. 21天学通C语言-学习笔记(7)
  12. 基于Matlab的自适应低通滤波器设计,基于MATLAB的自适应滤波器的设计
  13. 网站跳转第三方QQ、微信登陆
  14. 任天堂Wii有一些伟大的Wii游戏为Wii控制台你有此致
  15. 苹果在中国失掉 iPad 商标
  16. linux查看进程limits解释,linux中/etc/security/limits.conf配置文件说明
  17. 【Python】计算VOC格式XML文件中目标面积和长宽比并生成直方图
  18. 【铁矿石期货怎么开通】11月22日午盘基本面资讯整理
  19. 数据交换方式(电路交换、数据报交换、分组交换)
  20. ATF:Gicv源码文件系列-gicv2.h

热门文章

  1. 上证50基金有哪些_上证50指数基金哪个好?怎么选?
  2. 网站推广软件-最新网站推广软件【推荐】
  3. SQL Server:偏移量为 0x0000000009c000 的位置执行 读取 期间,操作系统已经向 SQL Server 返回了错误 21的解决方法
  4. 递归算法实现角谷定理
  5. 错失英语,还是想错失另一个世界?
  6. 期货开户办理银期转账签约的时间
  7. 青龙面板获取京东ck的新老方法
  8. 在 React JS 中使用 JSON 占位符的Web 简易应用程序
  9. java isnan_Java Float isNaN()用法及代码示例
  10. 【Windows任务管理器硬盘监控功能异常】任务管理器磁盘读写功能异常,无任何数据