P3975 [TJOI2015]弦论

题目描述

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

输入输出格式

输入格式:

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

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

输出格式:

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

说明

数据范围

对于\(10\%\)的数据,\(n ≤ 1000\)。

对于\(50\%\)的数据,\(t = 0\)。

对于\(100\%\)的数据,\(n ≤ 5 × 10^5, t < 2, k ≤ 10^9\)。


建立后缀自动机,按要求统计每个状态的贡献。

然后在自动机上(非par树)统计一下后缀数量,根据后缀数量进入后面的节点,得到的一条路径即为答案


Code:

#include <cstdio>
#include <cstring>
const int N=1e6+10;
char s[N];
int t,k,n,tax[N],A[N];
int len[N],ch[N][26],siz[N],par[N],sum[N],tot=1,las=1;
void extend(int c)
{int now=++tot,p=las;len[now]=len[p]+1,siz[now]=1;while(p&&!ch[p][c]) ch[p][c]=now,p=par[p];if(!p) par[now]=1;else{int x=ch[p][c];if(len[x]==len[p]+1) par[now]=x;else{int y=++tot;len[y]=len[p]+1,par[y]=par[x];memcpy(ch[y],ch[x],sizeof ch[x]);while(p&&ch[p][c]==x) ch[p][c]=y,p=par[p];par[now]=par[x]=y;}}las=now;
}
int main()
{scanf("%s%d%d",s+1,&t,&k);n=strlen(s+1);for(int i=1;i<=n;i++) extend(s[i]-'a');for(int i=1;i<=tot;i++) ++tax[len[i]];for(int i=1;i<=n;i++) tax[i]+=tax[i-1];for(int i=1;i<=tot;i++) A[tax[len[i]]--]=i;for(int i=tot;i;i--){if(t) siz[par[A[i]]]+=siz[A[i]];else siz[A[i]]=1;}siz[1]=0;for(int i=tot;i;i--){sum[A[i]]=siz[A[i]];for(int c=0;c<26;c++)sum[A[i]]+=sum[ch[A[i]][c]];}if(sum[1]<k) return puts("-1"),0;int now=1;while(k>0){int c=0;while(k>sum[ch[now][c]]) k-=sum[ch[now][c++]];putchar(c+'a');now=ch[now][c];k-=siz[now];}return 0;
}

2019.1.7

转载于:https://www.cnblogs.com/butterflydew/p/10231548.html

洛谷 P3975 [TJOI2015]弦论 解题报告相关推荐

  1. 洛谷 [P3975 [TJOI2015]弦论

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

  2. 洛谷P3975 - [TJOI2015]弦论

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

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

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

  4. 洛谷P3975 [TJOI2015]弦论

    链接 点击跳转 题解 后缀自动机上每条路径都是一个子串 对于t=0t=0t=0,实际上是统计字典序第kkk小的子串,自下向上进行一个dpdpdp就可以解决这个问题 对于t=1t=1t=1,每条路径都被 ...

  5. [洛谷P3975][TJOI2015]弦论

    题目大意:求一个字符串的第$k$大字串,$t$表示长得一样位置不同的字串是否算多个 题解:$SAM$,先求出每个位置可以到达多少个字串($Right$数组),然后在转移图上$DP$,若$t=1$,初始 ...

  6. bzoj3998/洛谷3975 [TJOI2015]弦论 (后缀自动机)

    bzoj3998/洛谷3975 [TJOI2015]弦论 题意:求第 k 小字串 方法:先建立SAM,和上一题一样按照拓扑序求出size(表示这个串出现的次数).这道题我们需要求第 k 小,所以我们还 ...

  7. 洛谷_3975 [TJOI2015]弦论(后缀自动机)

    [TJOI2015]弦论 题目链接:https://www.luogu.com.cn/problem/P3975 题解: 对于T==0,只需要构造自动机,将每个状态节点的cnt设为1,然后DFS即可. ...

  8. 洛谷1056 排座椅 解题报告

    洛谷1056 排座椅 本题地址: http://www.luogu.org/problem/show?pid=1056 题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头 ...

  9. 洛谷1067 多项式输出 解题报告

    洛谷1067 多项式输出 本题地址: http://www.luogu.org/problem/show?pid=1067 题目描述 一元 n 次多项式可用如下的表达式表示: 其中,aixi称为 i ...

最新文章

  1. 阿里P7/P8学习路线图——技术封神之路
  2. Flask框架(SQLAlchemy(python3版本)中修改数据的方法和删除数据 的方法)
  3. 常见优化Sql查询性能的方法收集
  4. axios 中文文档、使用说明
  5. 胃癌2019csco指南_2019 CSCO胃癌诊疗指南精华来了!
  6. .NET MVC Scripts.Render 上下文不存在问题解决方法
  7. QMessageBox改变大小
  8. POJ 3125 Printer Queue(队列,水题)
  9. JavaScript(3):JS和Html
  10. Notepad2替换windows自带记事本
  11. 2009年的MACBOOK苹果电脑重装MAC OS 10.8.5系统
  12. DOS命令的英文全称
  13. Lead-follower因子:新闻共现股票收益的关联性研究
  14. UNCTF2022 部分writeup
  15. 网路安全之HTTP状态码
  16. 返回const指针与返回const引用区别
  17. CSS-精灵图片的使用(从一张图片中截图指定位置图标)
  18. Android studio入门到精通实例实验
  19. inputStream(mark函数的应用)
  20. sklearn的决策树和随即森林的demo

热门文章

  1. 如何用计算机做音乐,怎么制作音乐-手把手教你用废旧物品DIY音乐道具,超好玩!...
  2. vue报错:vue.js:634 [Vue warn]: Cannot find element: #app
  3. 前端面试送命题-JS三座大山
  4. Vue3源码解析01--Vue3初探
  5. 读书笔记 《拆掉思维里的墙》
  6. windows11家庭版安装hyperv-v
  7. 禁止ios版本上拉回弹效果
  8. 字体反爬-汽车之家论坛
  9. 芯片短缺局势依然严峻,供应链上下该如何破局?
  10. AnimatedIcon