当前位置: 首页 > news >正文

BZOJ3998:[TJOI2015]弦论(SAM)

Description

对于一个给定长度为N的字符串,求它的第K小子串是什么。

Input

第一行是一个仅由小写英文字母构成的字符串S

第二行为两个整数T和K,T为0则表示不同位置的相同子串算作一个。T=1则表示不同位置的相同子串算作多个。K的意义如题所述。

Output

输出仅一行,为一个数字串,为第K小的子串。如果子串数目不足K个,则输出-1

Sample Input

aabc
0 3

Sample Output

aab

HINT

N<=5*10^5

T<2
K<=10^9

Solution

对于$t=0$的情况,我们将$right$集合赋值为$1$,否则就赋成正常的$right$集合大小。

因为$SAM$是一个$DAG$,所以可以对$right$集合求一个后缀和$sum$,然后用类似于平衡树查找第$k$大的方式找一下就好了。具体可以看代码,还是很好懂的……

Code

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #define N (1000009)
 5 using namespace std;
 6 
 7 int n,t,k,flag;
 8 char s[N];
 9 
10 struct SAM
11 {
12     int p,q,np,nq,last,cnt;
13     int fa[N],son[N][26],step[N],right[N];
14     int d[N],sum[N];
15     int wt[N],od[N];
16     SAM(){last=cnt=1;}
17     
18     void Insert(int x)
19     {
20         p=last; np=last=++cnt; step[np]=step[p]+1; right[np]=1;
21         while (!son[p][x] && p) son[p][x]=np, p=fa[p];
22         if (!p) fa[np]=1;
23         else
24         {
25             q=son[p][x];
26             if (step[p]+1==step[q]) fa[np]=q;
27             else
28             {
29                 nq=++cnt; step[nq]=step[p]+1;
30                 memcpy(son[nq],son[q],sizeof(son[q]));
31                 fa[nq]=fa[q]; fa[q]=fa[np]=nq;
32                 while (son[p][x]==q) son[p][x]=nq, p=fa[p];
33             }
34         }
35     }
36     void Calc()
37     {
38         for (int i=1; i<=cnt; ++i) wt[step[i]]++;
39         for (int i=1; i<=n; ++i) wt[i]+=wt[i-1];
40         for (int i=cnt; i>=1; --i) od[wt[step[i]]--]=i;
41         for (int i=cnt; i>=1; --i)    
42             if (t) right[fa[od[i]]]+=right[od[i]];
43             else right[od[i]]=1;
44         right[1]=0;
45         for (int i=cnt; i>=1; --i)
46         {
47             sum[od[i]]=right[od[i]];
48             for (int j=0; j<26; ++j)
49                 sum[od[i]]+=sum[son[od[i]][j]];
50         }
51     }
52     void Query(int x,int k)
53     {
54         if (k<=right[x]) return;
55         k-=right[x];
56         for (int i=0; i<26; ++i)
57         {
58             if (!son[x][i]) continue;
59             if (k<=sum[son[x][i]])
60             {
61                 flag=1;
62                 printf("%c",'a'+i);
63                 Query(son[x][i],k);
64                 return;
65             }
66             k-=sum[son[x][i]];
67         }
68     }
69 }SAM;
70 
71 int main()
72 {
73     scanf("%s%d%d",s,&t,&k);
74     n=strlen(s);
75     for (int i=0; i<n; ++i)
76         SAM.Insert(s[i]-'a');
77     SAM.Calc(); SAM.Query(1,k);
78     if (!flag) puts("-1");
79 }

转载于:https://www.cnblogs.com/refun/p/10419569.html

相关文章:

  • tablelayout高度问题
  • JQuery Event属性说明
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • 转 Vlan
  • k8s健康检查(七)--技术流ken
  • php-configure错误解决
  • docker 9 docker的容器命令
  • oracle导入导出
  • 工作中对git使用的总结
  • 注册InstallShield Limited Edition for Visual Studio 时无法选择国家解决方法
  • AJAX CRUD
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • jq+css+html简单实现导航下拉菜单
  • 使用docker-compose进行多节点部署
  • 一次goldengate故障引发的操作系统hang起,HA自动切换
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • [笔记] php常见简单功能及函数
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 2017前端实习生面试总结
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • iOS小技巧之UIImagePickerController实现头像选择
  • python大佬养成计划----difflib模块
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 基于webpack 的 vue 多页架构
  • 记录一下第一次使用npm
  • 免费小说阅读小程序
  • 十年未变!安全,谁之责?(下)
  • 通信类
  • 小程序button引导用户授权
  • 白色的风信子
  • ​Python 3 新特性:类型注解
  • ​secrets --- 生成管理密码的安全随机数​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • # Java NIO(一)FileChannel
  • # Maven错误Error executing Maven
  • (175)FPGA门控时钟技术
  • (python)数据结构---字典
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (六)vue-router+UI组件库
  • (十三)Flask之特殊装饰器详解
  • (四)linux文件内容查看
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)iOS字体
  • (转)程序员技术练级攻略
  • (转载)利用webkit抓取动态网页和链接
  • .net 4.0发布后不能正常显示图片问题
  • .net 调用php,php 调用.net com组件 --
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .net快速开发框架源码分享
  • .NET中两种OCR方式对比
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [ SNOI 2013 ] Quare