弦论

一道板子题,让我感觉板子题都还不会。。。然后把递推写成dfs时没有给string加上&,导致内存爆了,2333,果然还是传引用好

题意:求字典序第K小子串以及本质不同的第K小子串

思路:

  1. 正常的建好后缀自动机
  2. 由于处理一个节点有多少endpos以及经过一个节点有多少子串都需要将所以节点按len从大到小排序,因此就不采用topo排序了
  3. 利用一次计数排序,即可完成长度排序,得到长度第i短的子串为a[i]
  4. 然后就是进行两个处理:endpos(cnt数组)大小以及size大小
  5. 最后是贪心的构建字典序第K小子串,但要记住当前节点字典序要比在后面增添字符后的字典序的小,所以要先考虑当前节点

题目描述

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

输入格式

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

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

输出格式

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

输入输出样例(有点难看,删掉了)

//#pragma comment(linker, "/STACK:102400000,102400000")
#include "bits/stdc++.h"
#define pb push_back
#define ls l,m,now<<1
#define rs m+1,r,now<<1|1
#define hhh printf("hhh\n")
#define see(x) (cerr<<(#x)<<'='<<(x)<<endl)
using namespace std;
typedef long long ll;
typedef pair<int,int> pr;
inline int read() {int x=0;char c=getchar();while(c<'0'||c>'9')c=getchar();while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x;}const int maxn = 1e6+10;
const int mod = 1e9+7;
const double eps = 1e-9;char s[maxn];
int ch[maxn][26], fa[maxn], cnt[maxn], son[maxn], len[maxn];
int last=1, sz=1, n, a[maxn], c[maxn];
ll size[maxn];void add(int c) {int p=last, np=last=++sz;len[np]=len[p]+1, cnt[np]=1;for(; p&&!ch[p][c]; p=fa[p]) ch[p][c]=np;if(!p) fa[np]=1;else {int q=ch[p][c];if(len[q]==len[p]+1) fa[np]=q;else {int nq=++sz;fa[nq]=fa[q], len[nq]=len[p]+1;memcpy(ch[nq],ch[q],104);fa[q]=fa[np]=nq;for(; p&&ch[p][c]==q; p=fa[p]) ch[p][c]=nq;}}
}void solve(int now, int k, string &l) {if(k>size[now]) {cout<<-1<<endl;return;}if(k<=cnt[now]) {cout<<l<<endl;return;}k-=cnt[now];for(int i=0; i<26; ++i) {int v=ch[now][i];if(v&&k<=size[v]) {solve(v,k,l+=char(i+'a'));return;}k-=size[v];}
}int main() {//ios::sync_with_stdio(false);scanf("%s", s); n=strlen(s);int t=read(), k=read();for(int i=0; i<n; ++i) add(s[i]-'a');for(int i=1; i<=sz; ++i) c[len[i]]++;for(int i=1; i<=sz; ++i) c[i]+=c[i-1];for(int i=1; i<=sz; ++i) a[c[len[i]]--]=i;for(int i=sz; i; --i)if(t) cnt[fa[a[i]]]+=cnt[a[i]];else cnt[a[i]]=1;cnt[1]=0; //cnt[1]本来等于字符串长度n的for(int i=sz; i; --i) {size[a[i]]=cnt[a[i]];for(int j=0; j<26; ++j)if(ch[a[i]][j]) size[a[i]]+=size[ch[a[i]][j]];}string l;solve(1,k,l);
}

洛谷-P3975 弦论(后缀自动机板子题)相关推荐

  1. 洛谷P3975 弦论

    题意:求一个串的字典序第k小的子串/本质不同第k小的子串. 解:一开始我的想法是在后缀树上找,但是不知道后缀树上的边对应的是哪些字符... 然而可以不用fail树转移,用转移边转移即可. 先建一个后缀 ...

  2. 洛谷 [P3975 [TJOI2015]弦论

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

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

    题目链接 建出后缀自动机. T=0,每个子串算一次,否则每个子串算该子串的\(endpos\)集合大小次. 用\(f[i]\)表示结点\(i\)表示的\(endpos\)集合大小,则\(f[i]\)为 ...

  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. P3975 [TJOI2015]弦论 - 后缀自动机(SAM)

    这是一道板子题的改编,意在加深对求第k小子串的理解.首先先看一下最简单的SAM板子.相信应该都写过了才会写这题 // // Created by acer on 2021/2/16. // //判断子 ...

  8. 洛谷 P-4045 密码(AC自动机+状态压缩+数位DP+乱搞)

    洛谷 P-4045 密码 记AC的第一道黑题! 题意:已知一段密码包含了一些字符串,然后求满足条件的密码有多少个,数量小于42时还得全部输出 思路: 一开始WA了两个点,不知道WA的什么,索性把读入的 ...

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

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

最新文章

  1. java opencv4.40图片实现人脸识别(2)
  2. vue父子组件传值,sync语法糖
  3. mysql update多个字段 逗号 and 的错误例子
  4. opencv---JPEG图像质量检测代码
  5. /bin/bash^M: bad interpreter
  6. 【忘川风华录】可爱的大“装备”?名士猫交互设计复盘
  7. ubuntu 安装 OpenCV-CUDA
  8. 数据资产纳入国资保值增值考核
  9. 以太网口差分电平_高速串行总线设计基础(八)揭秘SERDES高速面纱之CML电平标准与预加重技术...
  10. 解决Gerrit的git unpack error问题
  11. 两个简单方法快速解决怎么把kux格式转mp4
  12. c# 使用Entity Framework操作Access数据库
  13. 微信 获取signature签名
  14. SQL中is not null和!=“ “的区别
  15. 商用密码企业调研(必做) 20181314
  16. Virtualbox加载虚拟机镜像
  17. eclipse的plugins导入hadoop-eclipse-plugin-2.6.0.jar后Preference下没有hadoop Map/Reduce的解决方法
  18. 您真的会用百度吗?(百度搜索技巧-超详细)
  19. 向oracle中插入图片和读取图片
  20. Android百度地图短链分享的使用

热门文章

  1. 计算机专业我的工匠梦作文,【推荐】我的科技梦作文7篇
  2. EBS开发_fnd_message使用
  3. Arcgis更换布局模板_PPT模板到底怎么用呢?
  4. Java - System.setOut() 与 System.setIn()
  5. 从零开发短视频电商 隐藏业务ID以及缩短业务链接
  6. 创宇蜜罐入驻华为严选商城,与华为云共同构建积极纵深防御体系
  7. 计算机中及格人数怎么算,在excel中如何计算及格率和优秀率及统计各分数段人数...
  8. 关于 Bandizip 每次解压都催你更新
  9. JUC源码分析16-集合-ConcurrentSkipListMap、ConcurrentSkipListSet
  10. JPG/JEPG在十六进制文件格式