随笔分类 - 字符串处理——后缀自动机(SAM)
摘要:【传送门:SPOJ1811&BZOJ2946】 简要题意: 给出若干个字符串,求出这些字符串的最长公共子串 题解: 后缀自动机 这两道题的区别只是在于一道给出了字符串个数,一个没给,不过也差不多(代码就贴SPOJ的,因为数据范围大一点) 首先用第一个字符串构造SAM 然后处理其他的每个串在后缀自动机
阅读全文
摘要:【传送门:SPOJ1811】 简要题意: 给出两个字符串,求出两个字符串的最长公共子串 题解: 后缀自动机 先用第一个字符串构建SAM,然后用第二个字符串去跑 假设当前的公共子串长度为s,在SAM的状态为p,匹配到第二个字符串的第i个字符 如果p存在连向第i个字符的边,则p=tr[p].son[st
阅读全文
摘要:【传送门:BZOJ4516】 简要题意: 给出一个长度为n的数字字符串,求出每个数字插入到字符串结尾时的不同子串个数 题解: 后缀自动机 对于一个状态s,他的right集合代表的子串的长度就是(dep[fail],dep[s]]。这道题我们需要动态的维护不同子串的个数,每次从头扫一遍直接计算肯定不行
阅读全文
摘要:【传送门:BZOJ3998】 简要题意: 对于一个给定长度为N的字符串,求它的第K小子串是什么 题解: 后缀自动机 首先对于T=0的时候,所有的能到达的不同状态,Right集合大小恒为1 T=1的时候,就累加 然后先判断子串数量是否超过K 如果没有,则直接DFS就好了 参考代码:
阅读全文
摘要:【传送门:SPOJ8222】 简要题意: 给出一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值。求F(1)..F(Lengh(S)); 题解: 后缀自动机的模板题(会SAM是没有用的,会DP和广义才有用——Cherish_OI) 只要求出每个状态的Right集合的个数就可以求出
阅读全文