bzoj3998/洛谷3975 [TJOI2015]弦论

题意:求第 k 小字串

方法:先建立SAM,和上一题一样按照拓扑序求出size(表示这个串出现的次数)。这道题我们需要求第 k 小,所以我们还要求出每个点下面一共有多少个串。搜第 k 小就dfs深搜就可以了。

#include <cstdio>
#include <cstring>
#define N 500010
int n,m,last,root,t,k,son[N<<1][26],fa[N<<1],mx[N<<1],size[N<<1],c[N<<1],sum[N<<1],a[N<<1];
char str[N];
inline void ins(int ch){int p=last,np=++n;last=n;mx[np]=mx[p]+1;while(p && !son[p][ch]) son[p][ch]=np,p=fa[p];if(!p) fa[np]=root;else{int q=son[p][ch];if(mx[p]+1==mx[q]) fa[np]=q;else{int nq=++n;mx[nq]=mx[p]+1;memcpy(son[nq],son[q],sizeof(son[q]));fa[nq]=fa[q];fa[np]=fa[q]=nq;while(son[p][ch]==q) son[p][ch]=nq,p=fa[p];}}size[np]++;
}
void dfs(int p,int s){if(s<=size[p])  return;s-=size[p];for(int i=0;i<26;i++){if(son[p][i]){if(s<=sum[son[p][i]]){putchar(i+'a');dfs(son[p][i],s);return;}s-=sum[son[p][i]];}}
}
int main(){scanf("%s%d%d",str+1,&t,&k);int m=strlen(str+1);last=root=++n;for(int i=1;i<=m;i++) ins(str[i]-'a');for(int i=1;i<=n;i++) c[mx[i]]++;for(int i=1;i<=n;i++) c[i]+=c[i-1];for(int i=n;i>=1;i--) a[c[mx[i]]--]=i;for(int i=n;i>=1;i--){int p=a[i];if(t==1) size[fa[p]]+=size[p];else size[p]=1; }size[1]=0;for(int i=n;i>=1;i--){int p=a[i];sum[p]=size[p];for(int j=0;j<26;j++) sum[p]+=sum[son[p][j]];}if(sum[1]>=k) dfs(1,k);else puts("-1");return 0;
} 

bzoj3998/洛谷3975 [TJOI2015]弦论 (后缀自动机)相关推荐

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

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

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

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

  3. 洛谷 [P3975 [TJOI2015]弦论

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

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

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

  5. 洛谷P3975 - [TJOI2015]弦论

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

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

    给定一个长度为n(5e5)的字符串,求它字典序第k小的子串. 输入还有一个t,t=0时表示不同位置的相同子串算作一个,t=1表示不同位置的相同子串算作多个. 使用后缀自动机. 后缀自动机中的每条路径对 ...

  7. [TJOI2015]弦论 后缀自动机

    字典序第 k 大 沿着自动机的边走即可,比较水的一道题吧. Code: #include <cstdio> #include <algorithm> #include < ...

  8. 洛谷 P4218 [CTSC2010]珠宝商 后缀自动机+点分治

    题目: https://www.luogu.org/problemnew/show/P4218 分析: 一种显然的暴力就是枚举一个起点,在这个点进行dfs,然后在后缀自动机上跟着跳.跳到的点的righ ...

  9. 洛谷P3975 [TJOI2015]弦论

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

最新文章

  1. SQLite与pandas
  2. 基于Conditional Layer Normalization的条件文本生成
  3. 软件工程概论 课堂练习 第2次作业1【思考:POS系统的对象关联】
  4. Install Shield制作安装包技巧(SQL篇)
  5. Science | 再创生命奇迹!日本科学家造出了不需要“父亲”的大鼠及小鼠
  6. 电脑有电流声怎么解决_【音响杂谈】音响有电流声怎么办 - 音响杂音的处理办法...
  7. ZZULIOJ1051-1055Python解法
  8. 如何设置.net控件SplitContainer平均分配
  9. 【CSS3】C3动画总结
  10. C语言:梯形面积的求解公式为 S = (a + b) * h / 2。从键盘读入一个梯形的上底a、下底b和高h,请计算表梯形的面积。(结果保留1位小数)
  11. html鼠标移动到文字改变样式,css实现鼠标滑过改变文字(中文变英文)
  12. 蓝湖 Axure 墨刀
  13. uniapp返回上一级选择性刷新数据,不重新加载页面
  14. 开关电源的共模干扰抑制技术
  15. 什么是量化交易-量化交易demo
  16. 二叉查找树与红黑树原理和程序全面介绍
  17. arm服务器虚拟x86,x86服务器与arm
  18. css超级无敌不会,一大堆疑问大全
  19. GoshawkDB:一个分布式、支持事务与容错的对象存储
  20. Flink (四) Flink 的安装和部署- Flink on Yarn 模式 / 集群HA / 并行度和Slot

热门文章

  1. 删除姓名、年龄重复的记录——数据库
  2. c语言赛车游戏代码,python制作赛车游戏
  3. 文档在线预览产品系列-解决方案篇
  4. http://www.blogjava.net/beansoft/archive/2007/03/09/102812.html
  5. 欧拉角变化率和机体角速度的关系
  6. 信号与系统——典型的连续时间信号讲解
  7. Python《机器学习实战》读书笔记(三)——决策树
  8. 年薪50W京东软件测试工程师的成长路 —— 我们都曾一样迷茫
  9. 操作演示 | 如何将示波器波形直接保存到PC端
  10. 深度剖析apachepdf下载_软件定义汽车趋势下的供应链趋势(17页可下载)