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+5; struct tree{int a[26],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+1;for(;p&&!tr[p].a[c];p=tr[p].fa)tr[p].a[c]=np;if(!p)tr[np].fa=1;else{int q=tr[p].a[c];if(tr[p].l+1==tr[q].l)tr[np].fa=q;else{int nq=++cnt;tr[nq].l=tr[p].l+1;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]=1; } int main(){scanf("%s%d%d",s,&t,&k);int len=strlen(s);last=cnt=1;for(int i=0;i<len;i++)insert(s[i]-'a');for(int i=1;i<=cnt;i++)w[tr[i].l]++;for(int i=1;i<=len;i++)w[i]+=w[i-1];for(int i=1;i<=cnt;i++)a[w[tr[i].l]--]=i;for(int i=cnt;i>=1;i--){if(t)size[tr[a[i]].fa]+=size[a[i]];else size[a[i]]=1;}size[1]=0;for(int i=cnt;i>=1;i--){sum[a[i]]=size[a[i]];for(int j=0;j<26;j++)if(tr[a[i]].a[j])sum[a[i]]+=sum[tr[a[i]].a[j]];}if(k>sum[1])puts("-1");else{int now=1;while(k>size[now]){k-=size[now];int i;for(int i=0;i<26;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 0; }
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
转载于:https://www.cnblogs.com/luyouqi233/p/8776119.html
BZOJ3998:[TJOI2015]弦论——题解相关推荐
- [BZOJ3998][TJOI2015]弦论
[BZOJ3998][TJOI2015]弦论 试题描述 对于一个给定长度为N的字符串,求它的第K小子串是什么. 输入 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T和K,T为0则表示不 ...
- 【后缀自动机】Luogu P3975 [TJOI2015]弦论题解
[TJOI2015]弦论 题目描述 为了提高智商,ZJY 开始学习弦论.这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为 nnn 的字符串,求出它的第 ...
- BZOJ3998 TJOI2015弦论(后缀数组+二分答案)
先看t=1的情况.显然得求出SA(因为我不会SAM).我们一位位地确定答案.设填到了第len位,二分这一位填什么之后,在已经确定的答案所在的范围(SA上的某段区间)内二分,找到最后一个小于当前串的后缀 ...
- Bzoj3998: [TJOI2015]弦论
题面 传送门 Sol \(sam\) 求一个串的不重复的第\(k\)小子串很好办 如果可以相同 那么要算上每个点(前缀)的后缀的个数 那么就是这个\(endpos(right)\)集合的子串的出现次数 ...
- BZOJ3998: [TJOI2015]弦论(后缀自动机,Parent树)
Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T和K,T为0则表示不同位置的相同子串算作一个. ...
- bzoj3998 [TJOI2015]弦论
后缀自动机 我们建出后缀自动机,对于每个节点我们算出他和他的后继结点一共可以形成多少个不同的串,不同根据t来定义 这里我们不需要考虑每个节点代表的那些等价类字符串,因为那些字符串不同的前缀在到达这个节 ...
- bzoj3998/洛谷3975 [TJOI2015]弦论 (后缀自动机)
bzoj3998/洛谷3975 [TJOI2015]弦论 题意:求第 k 小字串 方法:先建立SAM,和上一题一样按照拓扑序求出size(表示这个串出现的次数).这道题我们需要求第 k 小,所以我们还 ...
- 洛谷P3975 - [TJOI2015]弦论
Portal Description 给出一个小写字母串\(s(|s|\leq5\times10^5),t\in\{0,1\},k(k\leq10^9)\),求\(s\)的第\(k\)小子串.\(t= ...
- 洛谷_3975 [TJOI2015]弦论(后缀自动机)
[TJOI2015]弦论 题目链接:https://www.luogu.com.cn/problem/P3975 题解: 对于T==0,只需要构造自动机,将每个状态节点的cnt设为1,然后DFS即可. ...
最新文章
- 教你如何追缴中国移动恶意扣费:lol :lol
- 半导体理论(第1部分)本征半导体
- htm、html、shtml网页区别
- 捉虫记 NullPointerException
- Windows Server 2019 Standard上部署安装MongoDB
- Python中for else注意事项
- 博客的起死复生+慎改wdpc端口
- STL算法入门基础【OI缩水版】
- java实现用户分组,java实现分组算法,根据每组多少人来进行分组
- 配置Outlook连接Exchange
- 使用java发送邮件(支持多人)
- 微星主板黑苹果_黑苹果安装教程:准备磁盘+主板BIOS设置——墨涩网
- Ds918 ds3615 ds3617区别_苹果678有什么区别
- 文献--A Survey on Server-side Approaches to Securing Web Applications
- 对多频外差的改进-校正伽马误差
- 删除文件时提示:无法读源文件或磁盘之解决办法
- Apache NiFi简介
- sql如何求连续打卡
- 【bzoj3295】动态逆序对
- VSTO PPT图表对象的操作(1)
热门文章
- 安装ORACLE 11G R2 +redhat es4遇到的问题
- android 打包时报错解决
- Chrome MessageLoop类分析
- 关于Adapter的The content of the adapter has changed but ListView did not receive a notification.问题分析
- from torch._C import * ImportError: DLL load failed解决方法
- Python报错:UnicodeDecodeError:‘ascii‘ codec can‘t decode byte 0xe8 in position
- Flutter漫说:组件生命周期、State状态管理及局部重绘的实现(Inherit)
- [BZOJ 2844] albus就是要第一个出场
- MySQL缓存之Qcache与buffer pool对比
- 弹窗在大屏上居中对齐,在小屏上被挡住解决方案