BZOJ3998:[TJOI2015]弦论——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3998
https://www.luogu.org/problemnew/show/P3975
对于一个给定长度为N的字符串,求它的第K小子串是什么。
后缀自动机,对l排序然后从后往前推size和sum数组(貌似也可以叫拓扑?)。
size:当前状态的字符串个数(贡献)。
sum:以当前状态为起点之后的满足要求的字符串个数。
- #include<cstdio>
- #include<iostream>
- #include<queue>
- #include<cstring>
- #include<algorithm>
- #include<cctype>
- using namespace std;
- typedef long long ll;
- const int N=1e6+;
- struct tree{
- int a[],fa,l;
- }tr[N];
- char s[N];
- int last,cnt,t,k;
- ll a[N],w[N],size[N],sum[N];
- inline void insert(int c){
- int p=last,np=++cnt;
- last=np;tr[np].l=tr[p].l+;
- for(;p&&!tr[p].a[c];p=tr[p].fa)tr[p].a[c]=np;
- if(!p)tr[np].fa=;
- else{
- int q=tr[p].a[c];
- if(tr[p].l+==tr[q].l)tr[np].fa=q;
- else{
- int nq=++cnt;tr[nq].l=tr[p].l+;
- memcpy(tr[nq].a,tr[q].a,sizeof(tr[q].a));
- tr[nq].fa=tr[q].fa;tr[q].fa=tr[np].fa=nq;
- for(;p&&tr[p].a[c]==q;p=tr[p].fa)tr[p].a[c]=nq;
- }
- }
- size[np]=;
- }
- int main(){
- scanf("%s%d%d",s,&t,&k);
- int len=strlen(s);
- last=cnt=;
- for(int i=;i<len;i++)insert(s[i]-'a');
- for(int i=;i<=cnt;i++)w[tr[i].l]++;
- for(int i=;i<=len;i++)w[i]+=w[i-];
- for(int i=;i<=cnt;i++)a[w[tr[i].l]--]=i;
- for(int i=cnt;i>=;i--){
- if(t)size[tr[a[i]].fa]+=size[a[i]];
- else size[a[i]]=;
- }
- size[]=;
- for(int i=cnt;i>=;i--){
- sum[a[i]]=size[a[i]];
- for(int j=;j<;j++)
- if(tr[a[i]].a[j])
- sum[a[i]]+=sum[tr[a[i]].a[j]];
- }
- if(k>sum[])puts("-1");
- else{
- int now=;
- while(k>size[now]){
- k-=size[now];
- int i;
- for(int i=;i<;i++){
- if(k>sum[tr[now].a[i]])
- k-=sum[tr[now].a[i]];
- else{
- now=tr[now].a[i];
- putchar(i+'a');
- break;
- }
- }
- }
- puts("");
- }
- return ;
- }
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
BZOJ3998:[TJOI2015]弦论——题解的更多相关文章
- [bzoj3998][TJOI2015]弦论_后缀自动机
弦论 bzoj-3998 TJOI-2015 题目大意:给定一个字符串,求其$k$小子串. 注释:$1\le length \le 5\cdot 10^5$,$1\le k\le 10^9$. 想法: ...
- bzoj3998: [TJOI2015]弦论(SAM+dfs)
3998: [TJOI2015]弦论 题目:传送门 题解: SAM的入门题目(很好的复习了SAM并加强Right集合的使用) 其实对于第K小的字符串直接从root开始一通DFS就好,因为son边是直接 ...
- 洛谷 P3975 / loj 2102 [TJOI2015] 弦论 题解【后缀自动机】【拓扑排序】
后缀自动机入门. 题目描述 为了提高智商,ZJY 开始学习弦论. 这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为 \(n\) 的字符串,求出它的第 \ ...
- BZOJ3998 TJOI2015弦论(后缀数组+二分答案)
先看t=1的情况.显然得求出SA(因为我不会SAM).我们一位位地确定答案.设填到了第len位,二分这一位填什么之后,在已经确定的答案所在的范围(SA上的某段区间)内二分,找到最后一个小于当前串的后缀 ...
- BZOJ3998 [TJOI2015]弦论 【后缀自动机】
题目 对于一个给定长度为N的字符串,求它的第K小子串是什么. 输入格式 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T和K,T为0则表示不同位置的相同子串算作一个.T=1则表示不同位置 ...
- bzoj3998: [TJOI2015]弦论
SAM小裸题qwq #include <iostream> #include <cstdio> #include <cmath> #include <cstr ...
- bzoj3998 [TJOI2015]弦论(SAM)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3998 [题意] 询问排名第k的子串是谁,0代表相同子串不同位置算作相同,1代表相同子串 ...
- [bzoj3998][TJOI2015]弦论-后缀自动机
Brief Description 给定一个字符串, 您需要求出他的严格k小子串或非严格k小子串. Algorithm Design 考察使用后缀自动机. 首先原串建SAM, 然后如果考察每个状态代表 ...
- 2018.12.15 bzoj3998: [TJOI2015]弦论(后缀自动机)
传送门 后缀自动机基础题. 求第kkk小的子串(有可能要求本质不同) 直接建出samsamsam,然后给每个状态赋值之后在上面贪心选最小的(过程可以类比主席树/平衡树的查询操作)即可. 代码: #in ...
随机推荐
- webpack loader 生成虚拟文件的方案
此文已由作者张磊授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 前言 使用 webpack 的时候,难免需要写一些 loader,接着就会遇到一个很纠结的问题.该 loade ...
- webpack中Development和Production模式的区分打包
当我们在开发一个项目的时候,我们一般用development这个环境进行项目的开发,在这个环境下,webpack使用dev-server,帮我们启用一个服务器,然后这个服务器里面还集成了一些,比如hm ...
- JavaWeb(三)——Tomcat服务器(二)
一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下:
- PS 抠图和添加背景图
1.打开需要抠的图--然后使用套索类工具,魔棒类工具,钢笔类工具均可选择需要扣的图片范围任何在Delete(如果抠反了可以进行反选Ctrl +shift+I) 2.然后把任一一张背景图直接拖到PS里面 ...
- InnoDB锁冲突案例演示
Preface As we know,InnoDB is index organized table.InnoDB engine supports row-level lock bas ...
- 征战 OSG-序及目录
其实很早就应该写这个了,一直拖到现在就是因为懒啊. 自从七月演习回来,被划到三维平台开发部,就一直混日子,也没人带领,也没人问结果,就这么一直堕落下来了,直到有一天才发现自己也看不上自己了,觉得自己这 ...
- uiautomatorviewer定位App元素
这个工具是Android SDK自带的, 日常的工作中经常要使用的, 在C:\Android\sdk\tools\bin目录下: 双击之, 请注意, 我一般选择第一个机器人小图标Device Scre ...
- 【WXS全局对象】consloe
consloe对象 方法: 原型:console.log( [String] ) 说明:用于在 console 窗口输出信息,一般用于程序调试使用示例: console.log支持arguments类 ...
- 【Random】-随机数字-jmeter
参数化 Random 参数化,存储结果的变量名,名字写了,就可以给其它请求使用
- post接口_ajax上传
Action() { web_reg_save_param("find_msg", "LB=message\":\"", "RB= ...