摘要:
"bzoj" "luogu" 题意 有一棵树,每个节点上有一个字符,一条路径上的字符连起来就是一个字符串。求树上一共有多少个不同的字符串。 $n\le10^5$,字符集大小$c\le10$,只与一个空地相邻的空地数量不超过20个。 sol 最后一句话是这道题的关键。 什么叫做“只与一个空地相邻的空地 阅读全文
摘要:
"bzoj" 题意 给出$n$个串,求每个串中有多少个子串在至少$k$个串中出现过。 sol 广义后缀自动机。 先建好广义SAM,也就是把这$n$个串全都插到SAM里面去,那么可以维护每个状态在哪些串里面出现过。 可以给每个状态维护一个$set$,然后向上合并就是直接并起来。 这里我写基数排序结果鬼 阅读全文
摘要:
"bzoj" "luogu" 题意 求一个串的第k小子串,不同位置上的相同内容的子串有时会视作同一子串,有时视作不同子串。 sol 基数排序处理$size$。 “不同位置上的相同内容的子串是否视为相同”决定了一个状态对答案的贡献到底是$endpos$集合大小还是$1$。 除此之外就是第$k$小的查询 阅读全文
摘要:
"luogu" 题意 给一个串,求其第k小子串。 不同位置出现的内容相同的子串算作同一个子串。 有多组询问。 $n\le9 10^4,T\le500$ sol 建出SAM后跑一遍基数排序,预处理出每个状态可以转移到的子串个数。 然后就变成了一个比较经典的第$k$小问题:假设当前面临状态$now$,若 阅读全文
摘要:
"vjudge" 题意 求多个串的最长公共子串 sol 首先拿第一个串建SAM。 然后对于每一个串,在SAM上跑匹配。 那么最终就是要把多个串跑出匹配的信息合并起来。 具体来说,对每个串记录一下在每个状态上的最长长度,然后同一个状态上对每个串的最长长度取个$min$,最后再把每个状态取个$max$。 阅读全文
摘要:
"vjudge" 题意 求两个串的最长公共子串 sol 一个串建SAM,另一个串在SAM上跑匹配。 每次维护一下当前的最长长度就可以了。 code cpp include include include using namespace std; const int N = 5e5+5; int n, 阅读全文
摘要:
"bzoj" "luogu" 题意 求一个串每个前缀中含有多少个不同字串 $n\le100000$,字符集大小$10^9$ sol 后缀自动机的转移开个$map$就好了。 每次插入以后,新增的贡献就是$len[last] len[fa[last]]$。 累加即可。 code cpp include 阅读全文
摘要:
"vjudge" 题意 求长度为$i$的子串在原串中出现次数的最大值。 sol 还是直接求$endpos$集合大小。 最后做一遍后缀最大值,因为很明显答案单调不增。 code cpp include include include using namespace std; const int N = 阅读全文
摘要:
"luogu" 题目描述 给定一个只包含小写字母的字符串$S$ , 请你求出$S$的所有出现次数不为$1$的子串的出现次数乘上该子串长度的最大值。 sol “出现次数大于$1$”也就是$endpos$集合大小大于$1$。 所以可以直接上基数排序求每个状态的$endpos$集合大小。 (我可能比较无聊 阅读全文
摘要:
"vjudge" 题意 给你一个串,求不同字串个数。 $n\le10^5$ sol 直接建SAM然后输出$\sum_{i=1}^{tot}len[i] len[fa[i]]$ code cpp include include include using namespace std; const in 阅读全文