后缀自动机入门. 题目描述 为了提高智商,ZJY 开始学习弦论. 这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为 \(n\) 的字符串,求出它的第 \(k\) 小子串是什么.你能帮帮她吗? 输入输出格式 输入格式: 第一行是一个仅由小写英文字母构成的字符串 \(s\). 第二行为两个整数 \(t\) 和 \(k\),\(t\) 为 \(0\) 则表示不同位置的相同子串算作一个.\(t\) 为 \(1\) 则表示不同位置的相同子串算作多个.\(k\) 的意义…
luogu P3975 [TJOI2015]弦论 链接 bzoj 思路 建出sam. 子串算多个的,统计preant tree的子树大小,否则就是大小为1 然后再统计sam的节点能走到多少串. 然后就可以在sam的贪心的走了. 代码 #include <bits/stdc++.h> #define FOR(i,a,b) for(int i=a;i<=b;++i) #define ROF(i,a,b) for(int i=a;i>=b;--i) using namespace std…
题目链接 \(Click\) \(Here\) 题目大意: 重复子串不算的第\(k\)大子串 重复子串计入的第\(k\)大子串 写法:后缀自动机. 和\(OI\) \(Wiki\)上介绍的写法不太一样,因为要同时解决两个问题. 把字符串每个前缀所在等价类的\(siz\)记为\(1\),然后在\(parent\) \(tree\)上跑一次统计,就可以求出来每一个等价类在串中出现的次数.这里采用类似后缀排序的方法,对字符串按\(len\)为关键字进行排序.至于经过每个点的路径数\(sum\),可以在…
/** 首先通过SAM求出每个串本质不同的子串 然后发现转移不好处理整体的本质不同 形如串A可能状态有a,b,ab,空,串B可能状态有b,空两种, 那么我们需要处理ab + 空 和 a + b的情况 为了避免这种情况,我们强行假定 假若A的某个状态x存在字符b的trans, 那么他就不能从下一个自动机中开头为b的状态转移 实现这个可以通过预处理下个串每种字符开头的dp值或者采用所有无法匹配的叶子向之后的sam的root连边之后求DaG路径数的方式来统计答案 */ #include<cstdio>…
P3975 [TJOI2015]弦论 题目描述 为了提高智商,ZJY开始学习弦论.这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为\(n\)的字符串,求出它的第\(k\)小子串是什么.你能帮帮她吗? 输入输出格式 输入格式: 第一行是一个仅由小写英文字母构成的字符串\(s\) 第二行为两个整数\(t\)和\(k\),\(t\)为\(0\)则表示不同位置的相同子串算作一个,\(t\)为\(1\)则表示不同位置的相同子串算作多个.\(k\)的意义见题目描述. 输…
2021.07.17 题解 CF1385E Directing Edges(拓扑排序) CF1385E Directing Edges - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 给定一个由有向边与无向边组成的图,现在需要你把所有的无向边变成有向边,使得形成的图中没有环. 如果可以做到请输出该图,否则直接输出"NO". 注意多组询问. 分析: 对于一个有向无环图,一条边,拓扑序小的一端指向拓扑序大的一端,因此确定无向边的方向. 代码如下: #include…
https://www.lydsy.com/JudgeOnline/problem.php?id=3998 https://www.luogu.org/problemnew/show/P3975 对于一个给定长度为N的字符串,求它的第K小子串是什么. 后缀自动机,对l排序然后从后往前推size和sum数组(貌似也可以叫拓扑?). size:当前状态的字符串个数(贡献). sum:以当前状态为起点之后的满足要求的字符串个数. #include<cstdio> #include<iostre…
NOI2019考前做NOI2018题.. 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=5417 (luogu) https://www.luogu.org/problemnew/show/P4770 (uoj) http://uoj.ac/problem/395 题解: 其实非常水,转化成\(S[l,r]\)和\(T\)有多少本质不同的公共子串,我们就是要求出串\(T\)每个位置与\(S[l,r]\)最长匹配的长度.…
可能是一个 SAM 常用技巧?感觉 SAM 的基础题好多啊.. 题目描述 给定一个长度为 \(n\) 的字符串 \(S\) ,令 \(T_i\) 表示它从第 \(i\) 个字符开始的后缀,求: \[ \sum_{1\le i<j\le n}len(T_i)+len(T_j)-2\times lcp(T_i,T_j) \] 其中,\(len(a)\) 表示字符串 \(a\) 的长度,\(lcp(a,b)\) 表示字符串 \(a\) 和字符串 \(b\) 的最长公共前缀. 输入输出格式 输入格式:…
题目大意 对于一个给定的长度为n(\(n\leq5*10^5\))的字符串, 分别求出不同位置的相同子串算作一个.不同位置的相同子串算作多个时,它的第k(\(k\leq10^9\))小子串是什么 题解 建这个字符串的后缀自动机 先dp求出后缀自动机上每一个点能走到多少个字符串 然后从根节点出发,每次走连向dp值不超过k且尽可能大的点的边 代码 #include<algorithm> #include<cmath> #include<cstdio> #include<…