P3975 [TJOI2015]弦论
题目描述
为了提高智商,ZJY开始学习弦论。这一天,她在《 String theory》中看到了这样一道问题:对于一个给定的长度为n的字符串,求出它的第k小子串是什么。你能帮帮她吗?
输入输出格式
输入格式:
第一行是一个仅由小写英文字母构成的字符串s
第二行为两个整数t和k,t为0则表示不同位置的相同子串算作一个,t为1则表示不同位置的相同子串算作多个。k的意义见题目描述。
输出格式:
输出数据仅有一行,该行有一个字符串,为第k小的子串。若子串数目不足k个,则输出-1。
输入输出样例
aabc 0 3
aab
aabc 1 3
aa
aabc 1 11
-1
说明
数据范围
对于10%的数据,n ≤ 1000。
对于50%的数据,t = 0。
对于100%的数据,n ≤ 5 × 10^5, t < 2, k ≤ 10^9。
题解:首先题目有两个要求,t=1,不同位置相同子串看做不同;t=0:,不同位置的相同子串看成相同;
先对这个串建个SAM,再对所有节点按照maxlen排下序。这样就可以从长到短地总结答案。
首先对每个节点维护一个当前节点所占的子串个数。假如t=1就按照Parent树里从叶子节点一层一层往上推的顺序,计算每个串出现的次数。t=0就不用管,直接设成1
这样就可以维护出每个节点往后推会有多少个串。。(直接加起来
然后在SAM上按照字典序往下匹配就可以了
参考代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int INF=0x3f3f3f3f; const int maxn=1e6+10; char s[maxn]; int k,t; struct SAM{//求字典序第K小串 int l[maxn<<1],fa[maxn<<1],nxt[maxn<<1][26];int last,cnt,c[maxn<<1],siz[maxn<<1],sum[maxn<<1],a[maxn<<1];void Init(){memset(siz,0,sizeof(siz));memset(c,0,sizeof(c));memset(sum,0,sizeof(sum));memset(a,0,sizeof(a));last=cnt=1;memset(nxt[1],0,sizeof(nxt[1]));fa[1]=l[1]=0;}int NewNode(){cnt++;memset(nxt[cnt],0,sizeof(nxt[cnt]));fa[cnt]=l[cnt]=0;return cnt;}void Add(int ch){int p=last,np=NewNode();last=np; l[np]=l[p]+1;siz[np]=1;while(p&&!nxt[p][ch]) nxt[p][ch]=np,p=fa[p];if(!p) fa[np]=1;else{int q=nxt[p][ch];if(l[q]==l[p]+1) fa[np]=q;else{int nq=NewNode();memcpy(nxt[nq],nxt[q],sizeof(nxt[q]));fa[nq]=fa[q];l[nq]=l[p]+1;fa[np]=fa[q]=nq;while(nxt[p][ch]==q) nxt[p][ch]=nq,p=fa[p];}}}void Build(){int len=strlen(s+1);for(int i=1;i<=len;i++) Add(s[i]-'a');}void topusort(){for(int i=1;i<=cnt;++i) c[l[i]]++;for(int i=1;i<=cnt;++i) c[i]+=c[i-1];for(int i=1;i<=cnt;++i) a[c[l[i]]--]=i;for(int i=cnt;i;--i){//t==1:不同位置的相同子串视为不同 if(t) siz[fa[a[i]]]+=siz[a[i]];else siz[a[i]]=1;//t==0:视为相同 }siz[1]=0;for(int i=cnt;i;--i){sum[a[i]]=siz[a[i]];for(int j=0;j<26;++j)if(nxt[a[i]][j]) sum[a[i]]+=sum[nxt[a[i]][j]];}} void dfs(){if(k>sum[1]){puts("-1");return ;}int now=1;while(k>0){int p=0;while(k>sum[nxt[now][p]]){k-=sum[nxt[now][p]];p++;}now=nxt[now][p];putchar('a'+p);k-=siz[now];}return ;} } sam; int main() {scanf("%s%d%d",s+1,&t,&k);sam.Init();sam.Build(); sam.topusort();sam.dfs();return 0; }
View Code
转载于:https://www.cnblogs.com/songorz/p/10805198.html
P3975 [TJOI2015]弦论相关推荐
- 洛谷 P3975 [TJOI2015]弦论 解题报告
P3975 [TJOI2015]弦论 题目描述 为了提高智商,ZJY开始学习弦论.这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为\(n\)的字符串,求 ...
- 洛谷 [P3975 [TJOI2015]弦论
洛谷 P3975 [TJOI2015]弦论 题目描述 给定一个长度为 nnn 的字符串,求它的第 kkk 小字串:给定 ttt, ttt 为 000 则表示不同位置的相同子串算作一个,ttt 为 11 ...
- luogu P3975 [TJOI2015]弦论 SAM
luogu P3975 [TJOI2015]弦论 链接 bzoj 思路 建出sam. 子串算多个的,统计preant tree的子树大小,否则就是大小为1 然后再统计sam的节点能走到多少串. 然后就 ...
- P3975 [TJOI2015]弦论 (SAM)
[TJOI2015]弦论 - 洛谷 感觉位置不同算相同还是比较好想的,我们top排序后算每个点后面连接了多少点就知道里面有多少字串了,然后求k大就行了: 考了位置不同算不同的话,我们就要考虑endpo ...
- 洛谷P3975 - [TJOI2015]弦论
Portal Description 给出一个小写字母串\(s(|s|\leq5\times10^5),t\in\{0,1\},k(k\leq10^9)\),求\(s\)的第\(k\)小子串.\(t= ...
- 【后缀自动机】Luogu P3975 [TJOI2015]弦论题解
[TJOI2015]弦论 题目描述 为了提高智商,ZJY 开始学习弦论.这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为 nnn 的字符串,求出它的第 ...
- P3975 [TJOI2015]弦论 第K小子串
题目描述 https://www.luogu.org/problem/P3975 为了提高智商,ZJY开始学习弦论.这一天,她在< String theory>中看到了这样一道问题:对于一 ...
- [Luogu P3975] [TJOI2015]弦论
洛谷传送门 BZOJ传送门 题目描述 为了提高智商,ZJY开始学习弦论.这一天,她在< String theory>中看到了这样一道问题:对于一个给定的长度为nnn的字符串,求出它的第k& ...
- 洛谷 - P3975 [TJOI2015]弦论(后缀自动机)
题目链接:点击查看 题目大意:给出一个字符串 s,再给出一次询问,询问分为两种类型: 0 k:如果不同位置的相同子串算作一个,求第 k 小的子串 1 k:如果不同位置的相同子串算作多个,求第 k 小的 ...
最新文章
- mcs 4微型计算机,MCS-II高性能自主品牌的微机测速仪
- 不需要配置的python编辑器_不用调就能用的小白Python编辑器有哪些?
- 软件开发不是众人拾柴——《人月神话》读书笔记
- SQL JOIN\SQL INNER JOIN 关键字\SQL LEFT JOIN 关键字\SQL RIGHT JOIN 关键字\SQL FULL JOIN 关键字...
- 不作死就不会死,盘点那些死于自己发明的发明家
- python中函数的参数传递(传值还是传引用)
- js unescape 对应php的函数,php实现Javascript的escape和unescape函数
- 这个工具秒杀市面上各种可视化,可惜90%的人都没用过!
- 使用SafeViewFlipper避免ViewFlipper交替时Crash
- sqlserver编号
- iOS 操作系统被曝无线网络命名bug 导致 iPhone无法连接无线网络
- matlab论坛真不活跃,MATLAB中文论坛常见问题归纳
- hive如何获取当前时间
- 转:HashMap实现原理分析(面试问题:两个hashcode相同 的对象怎么存入hashmap的)...
- RocketMQ(十四)RocketMQ消息重试机制
- tp6配置日志 - nginx下配置Thinkphp6网站 - tp6实现简单路由跳转
- 三大云厂商 ARM 架构服务器性能对比
- vPlayer 模块Demo
- 留美学子安全手册,这个可以有
- 微信小程序之短信验证码
热门文章
- html打印为pdf表格显示不全,打印表格时内容显示不完整怎么办?四种方法解决WPS不完整问题...
- 元旦| 微软ATP伴你2023一路前行
- 曾志伟原创港式奶茶店—喜乐街,台州金清人民路新店开业
- Windows HPC Server 2008 R2 下载
- request_threaded_irq
- php crypt函数缓冲区溢出漏洞,GIMP 堆缓冲区溢出漏洞(CVE-2017-17784)
- c++#学生平均成绩,学号排序
- 共模电感适用的频率_共模电感磁芯的选择决定其性能和应用场景——原文转自金昊德官网...
- MATLAB颜色映像
- 计算Fisher信息之基础矩阵(一)