题目思路

对原串建立SAMSAMSAM,然后分情况考虑:

  • t=0t = 0t=0,代表本质不同即为不同,那么我们需要对每个SAMSAMSAM节点uuu维护uuu能够到达的点的数量,即为经过uuu的本质不同的子串的数量。
  • t=1t = 1t=1,代表位置不同即为不同,那么我们考虑对于每个节点uuu计算经过该点位置不同的子串数量。那么我们可以想到这需要先求串sss的出现次数,也就是endpos(s)endpos(s)endpos(s)的大小,而根到uuu表示的串的endposendposendpos大小为parenttreeparent\ treeparent tree上uuu的子树中的前缀点的数量

不难发现,我们可以维护一个dp[u]dp[u]dp[u]表示不同限制下的子串数目,以及每个点的点权。对于t=0t = 0t=0,所有点的点权都是111,否则先dfsdfsdfs求子树大小作为点权,然后dfsdfsdfs求答案即可。

#include <bits/stdc++.h>
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
#define int long long
#define endl '\n'
using namespace std;const int N = 1e6 + 10, MOD = 1e9 + 7;int dp[N], siz[N];struct SAM{int ch[N << 1][26], fa[N << 1], len[N << 1], vis[N << 1];int last, tot;SAM(): last(1), tot(1) {}inline void extend(int x){ //*单字符扩展int p = last, np = last = ++tot;len[np] = len[p] + 1, vis[np] = dp[np] = siz[np] = 1;for(; p && !ch[p][x]; p = fa[p]) ch[p][x] = np;if(!p) fa[np] = 1;else{int q = ch[p][x];if(len[q] == len[p] + 1) fa[np] = q;else {int nq = ++tot;memcpy(ch[nq], ch[q], sizeof(ch[nq]));fa[nq] = fa[q], fa[np] = fa[q] = nq, len[nq] = len[p] + 1;for(; ch[p][x] == q; p = fa[p]) ch[p][x] = nq;}}}
}sam;vector<int> g[N];void dfs1(int u){for(auto v : g[u]){dfs1(v);siz[u] += siz[v];}dp[u] = siz[u];
}bool vis[N];int dfs2(int u){if(vis[u]) return dp[u];vis[u] = true;for(int i = 0; i < 26; i++){int v = sam.ch[u][i];if(v) dp[u] += dfs2(v);}return dp[u];
}void build(int t){for(int i = 1; i <= sam.tot; i++){if(sam.fa[i]) g[sam.fa[i]].emplace_back(i);}if(!t){for(int i = 1; i <= sam.tot; i++) dp[i] = siz[i] = 1;} else {dfs1(1);}dp[1] = siz[1] = 0;dfs2(1);
}void query(int u, int k){if(k > dp[u]){cout << -1;return;}if(k <= siz[u]) return;k -= siz[u];for(int i = 0; i < 26; i++){int v = sam.ch[u][i];if(k > dp[v]) k -= dp[v];else{cout << (char)('a' + i);query(v, k);return;}}
}inline void solve(){string s; cin >> s;for(int i = 0; i < s.size(); i++) sam.extend(s[i] - 'a');int t, k; cin >> t >> k;build(t);query(1, k);
}signed main(){//ios_base::sync_with_stdio(false), cin.tie(0);cout << fixed << setprecision(12);int t = 1; //cin >> t;while(t--) solve();return 0;
}

[SAM模板题] P3975 [TJOI2015] 弦论相关推荐

  1. luogu P3975 [TJOI2015]弦论 SAM

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

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

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

  3. 洛谷 [P3975 [TJOI2015]弦论

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

  4. P3975 [TJOI2015]弦论 (SAM)

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

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

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

  6. 洛谷P3975 - [TJOI2015]弦论

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

  7. P3975 [TJOI2015]弦论 - 后缀自动机(SAM)

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

  8. [Luogu P3975] [TJOI2015]弦论

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

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

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

最新文章

  1. lucene构建同义词分词器
  2. kali linux 下载百度云大文件
  3. html的下拉框的几个基本使用方法
  4. 《模拟信息转换器(AIC)的实现技术研究》读书笔记
  5. 构造函数和析构函数的调用过程
  6. 子数组最大值设计02
  7. ASP导出EXCEL乱码?试试这个
  8. 【MM模块】 Goods Receipt 收货 3
  9. ICE专题:实现简单的聊天室(一)
  10. sqoop从mysql导入hdfs_3.使用sqoop从mysql 导入数据到hdfs
  11. android webview 长按复制,Android webview 点击或长按有蒙层 – 热爱改变生活
  12. Android无线测试之—UiAutomator UiDevice API介绍六
  13. 自己写的微信小程序炸金花简单版
  14. python练习题--斐波那契数列
  15. [TIPTOP] 鼎捷ERP開發小撇步 - 編譯程式碼 及 畫面檔 一次到位的方法
  16. Android与iPhone的对比(水木上看到的,不清楚原文来源)
  17. VirtualBox Linux 安装增强工具
  18. Unity 崩溃问题解决方法——之一
  19. 运动耳机哪种比较好用、最好用的运动耳机
  20. 模板解析原理,脱裤子放屁

热门文章

  1. Android Native 代码 Release 编译 - 隐藏符号表
  2. 淘系技术内容中台负责人接受采访回应“淘宝为什么要做媒体化升级”
  3. 计算机网络课程实验报告一
  4. Android联网失败报错:java.io.IOException: Cleartext HTTP traffic to xxx.xxx.xxx.xxx not permitted
  5. 【ROS学习】ROS分布式通信
  6. iOS 显示SVG文件的方法
  7. 侍魂服务器维护,侍魂胧月传说6月3日停机维护更新公告
  8. C--利用switch()浅浅做一个成绩等级划分小程序
  9. python小程序嵌入excel_用原生的方式操作Excel,Python玩转Excel神器xlsxwriter详解!...
  10. Typora配色方案