传送门 调代码调的我怀疑人生. 启发式合并用迭代写怎么都跑不过(雾 换成了dfsdfsdfs版本的终于过了233. 题意简述:求给出nnn个字串,对于每个给定的字串求出其有多少个字串在至少kkk个剩下字串中出现过. 显然先对所有字串建一个samsamsam出来,然后对于每个状态用一个setsetset维护在哪些字串里面出现过(这个显然需要在建完parentparentparent树之后启发式合并一波),最后拿每个串在上面匹配,如果当前的状态不满足题意就沿着树边向上跳即可. 代码: #includ…
题面 传送门 题解 为什么成天有人想搞些大新闻 这里写的是\(yyb\)巨巨说的启发式合并的做法(虽然\(LCT\)的做法不知道比它快到哪里去了--) 建出\(SAM\),那么两个前缀的最长公共后缀就是它们在\(parent\)树上的\(LCA\)的深度 对于每一个子串来说,所有和它相同的串里只有它的前驱和它的后继是有贡献的.这个只要考虑任何一个包含了这个子串和另外一个和它相同的子串的询问,这个询问必定包含它的前驱或后继 那么我们用\(set\)启发式合并来维护\(endpos\)集合,每一次只…
传送门 跟这道题是一模一样的. 于是本蒟蒻又写了一遍10min1A庆祝 代码: #include<bits/stdc++.h> #define ri register int using namespace std; const int N=2e5+5; typedef long long ll; int T,k; string s[N]; struct SAM{ int last,tot,len[N],son[N][26],link[N],val[N]; vector<int>e…
模板—字符串—后缀自动机(后缀自动机+线段树合并求right集合) Code: #include <bits/stdc++.h> using namespace std; #define N 100010 map <int,int> son[N<<1]; char str[N]; int root[N<<1],pla[N],len; int tot=1,last=1,pre[N<<1],dis[N<<1],in[N<<1]…
题目链接: [TJOI2019]甲苯先生和大中锋的字符串 对原串建后缀自动机并维护$parent$树上每个点的子树大小,显然子树大小为$k$的节点所代表的子串出现过$k$次,那么我们需要将$[len[fa[i]]+1,len[i]]$这一段区间的数目都$+1$,只需要差分即可,最后求前缀和并求出所有前缀和的最大值的位置即为答案. #include<set> #include<map> #include<queue> #include<stack> #incl…
题意 \(n\) 张卡牌 \(m\) 种颜色,询问有多少种本质不同的序列满足相邻颜色相同的位置数量等于 \(k\). 分析 首先本质不同不好直接处理,可以将同种颜色的卡牌看作是不相同的,求出答案后除以 \(\prod {a_i!}\) 即可. 如果我们能够得到一个至少存在 \(k\) 个魔术对的排列数,就可以容斥了. 考虑单独处理每种颜色, 枚举一个颜色 \(i\),计算这种颜色至少有 \(j\) 对的方案总数. 可以选择 \(j\) 张牌保证这些牌一定跟在某张牌的后面,这样就可以形成 \(\g…
传送门 samsamsam基础题. 题意简述:给出一个串,询问第kkk大的本质不同的串. 然而这就是弦论的简化版. 我们把samsamsam建出来然后贪心选择就行了. 代码: #include<bits/stdc++.h> #define ri register int using namespace std; const int N=2e5+5; int n,q,K; char s[N]; struct SAM{ int last,tot,len[N],link[N],son[N][26],…
传送门 题意简述:给出一棵trietrietrie树,每个点表示一个字符,求树上所有路径组成的不同字串数.(叶子数≤20\le 20≤20) 由于有一个神奇的条件,考虑以每一个叶子为树根统计每个点到树根的字串,这样就考虑到了所有情况,于是就这样建立广义samsamsam统计答案即可. 代码: #include<bits/stdc++.h> #define ri register int using namespace std; typedef long long ll; inline int…
Description 给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串? Input 第一行两个整数n,k. 接下来n行每行一个字符串. Output 一行n个整数,第i个整数表示第i个字符串的答案. Sample Input 3 1 abc a ab Sample Output 6 1 3 HINT 对于 100% 的数据,1<=n,k<=10^5,所有字符串总长不超过10^5,字符串只包含小写字母. Solution 加分隔符建出后缀数组,考虑…
动态维护任意两个后缀的lcp集合的mex,支持在串末尾追加字符. Solution 考虑在 SAM 上求两个后缀的 LCP 的过程,无非就是找它们在 fail 树上的 LCA,那么 LCP 长度就是这个点的 maxlen 那么在这里,当增量添加的时候,如果一个节点有了儿子,那么它就可能成为一个新的 LCP 于是我们在操作父子关系的时候暴力修改一个 bool 数组即可,答案的维护是均摊 \(O(n)\) 的 注意需要对输出 \(0\) 的情况做特判,比如这个例子 aaaabbbbab 输出的结果应…