题目描述

为了提高智商,ZJY开始学习弦论。这一天,她在《 String theory》中看到了这样一道问题:对于一个给定的长度为n的字符串,求出它的第k小子串是什么。你能帮帮她吗?

输入输出格式

输入格式:

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

第二行为两个整数t和k,t为0则表示不同位置的相同子串算作一个,t为1则表示不同位置的相同子串算作多个。k的意义见题目描述。

输出格式:

输出数据仅有一行,该行有一个字符串,为第k小的子串。若子串数目不足k个,则输出-1。

输入输出样例

输入样例#1:

aabc
0 3

输出样例#1:

aab

输入样例#2:

aabc
1 3

输出样例#2:

aa

输入样例#3:

aabc
1 11

输出样例#3:

-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]弦论相关推荐

  1. 洛谷 P3975 [TJOI2015]弦论 解题报告

    P3975 [TJOI2015]弦论 题目描述 为了提高智商,ZJY开始学习弦论.这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为\(n\)的字符串,求 ...

  2. 洛谷 [P3975 [TJOI2015]弦论

    洛谷 P3975 [TJOI2015]弦论 题目描述 给定一个长度为 nnn 的字符串,求它的第 kkk 小字串:给定 ttt, ttt 为 000 则表示不同位置的相同子串算作一个,ttt 为 11 ...

  3. luogu P3975 [TJOI2015]弦论 SAM

    luogu P3975 [TJOI2015]弦论 链接 bzoj 思路 建出sam. 子串算多个的,统计preant tree的子树大小,否则就是大小为1 然后再统计sam的节点能走到多少串. 然后就 ...

  4. P3975 [TJOI2015]弦论 (SAM)

    [TJOI2015]弦论 - 洛谷 感觉位置不同算相同还是比较好想的,我们top排序后算每个点后面连接了多少点就知道里面有多少字串了,然后求k大就行了: 考了位置不同算不同的话,我们就要考虑endpo ...

  5. 洛谷P3975 - [TJOI2015]弦论

    Portal Description 给出一个小写字母串\(s(|s|\leq5\times10^5),t\in\{0,1\},k(k\leq10^9)\),求\(s\)的第\(k\)小子串.\(t= ...

  6. 【后缀自动机】Luogu P3975 [TJOI2015]弦论题解

    [TJOI2015]弦论 题目描述 为了提高智商,ZJY 开始学习弦论.这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为 nnn 的字符串,求出它的第 ...

  7. P3975 [TJOI2015]弦论 第K小子串

    题目描述 https://www.luogu.org/problem/P3975 为了提高智商,ZJY开始学习弦论.这一天,她在< String theory>中看到了这样一道问题:对于一 ...

  8. [Luogu P3975] [TJOI2015]弦论

    洛谷传送门 BZOJ传送门 题目描述 为了提高智商,ZJY开始学习弦论.这一天,她在< String theory>中看到了这样一道问题:对于一个给定的长度为nnn的字符串,求出它的第k& ...

  9. 洛谷 - P3975 [TJOI2015]弦论(后缀自动机)

    题目链接:点击查看 题目大意:给出一个字符串 s,再给出一次询问,询问分为两种类型: 0 k:如果不同位置的相同子串算作一个,求第 k 小的子串 1 k:如果不同位置的相同子串算作多个,求第 k 小的 ...

最新文章

  1. mcs 4微型计算机,MCS-II高性能自主品牌的微机测速仪
  2. 不需要配置的python编辑器_不用调就能用的小白Python编辑器有哪些?
  3. 软件开发不是众人拾柴——《人月神话》读书笔记
  4. SQL JOIN\SQL INNER JOIN 关键字\SQL LEFT JOIN 关键字\SQL RIGHT JOIN 关键字\SQL FULL JOIN 关键字...
  5. 不作死就不会死,盘点那些死于自己发明的发明家
  6. python中函数的参数传递(传值还是传引用)
  7. js unescape 对应php的函数,php实现Javascript的escape和unescape函数
  8. 这个工具秒杀市面上各种可视化,可惜90%的人都没用过!
  9. 使用SafeViewFlipper避免ViewFlipper交替时Crash
  10. sqlserver编号
  11. iOS 操作系统被曝无线网络命名bug 导致 iPhone无法连接无线网络
  12. matlab论坛真不活跃,MATLAB中文论坛常见问题归纳
  13. hive如何获取当前时间
  14. 转:HashMap实现原理分析(面试问题:两个hashcode相同 的对象怎么存入hashmap的)...
  15. RocketMQ(十四)RocketMQ消息重试机制
  16. tp6配置日志 - nginx下配置Thinkphp6网站 - tp6实现简单路由跳转
  17. 三大云厂商 ARM 架构服务器性能对比
  18. vPlayer 模块Demo
  19. 留美学子安全手册,这个可以有
  20. 微信小程序之短信验证码

热门文章

  1. html打印为pdf表格显示不全,打印表格时内容显示不完整怎么办?四种方法解决WPS不完整问题...
  2. 元旦| 微软ATP伴你2023一路前行
  3. 曾志伟原创港式奶茶店—喜乐街,台州金清人民路新店开业
  4. Windows HPC Server 2008 R2 下载
  5. request_threaded_irq
  6. php crypt函数缓冲区溢出漏洞,GIMP 堆缓冲区溢出漏洞(CVE-2017-17784)
  7. c++#学生平均成绩,学号排序
  8. 共模电感适用的频率_共模电感磁芯的选择决定其性能和应用场景——原文转自金昊德官网...
  9. MATLAB颜色映像
  10. 计算Fisher信息之基础矩阵(一)