摘要:
题目大意: 给你一个数列,我们数列中两个串是相似的当且仅当这两个串的长度至少为5、两个串差分后形成的数列一样且不相交,求最长的相似串的长度。 思路: 后缀自动机求最长不相交重复子串。 首先将差分后的数列构造SAM,然后按照拓扑序DP,得到每个状态right集合的最大值t与最小值s,表示当前状态对应的 阅读全文
摘要:
题目大意: 给你两个字符串a和b,从中分别取出子串x和y,求不同的x+y的个数。 思路: 对于每一个字符串,构建SAM。 为了保证相同的x+y不会被重复统计,我们可以想办法只统计相同的x+y中x最长的一种情况。 考虑在SAM上DP。 用DFS对a的SAM进行遍历,若当前遍历到的串x不能加上字符c时, 阅读全文
摘要:
OJ题号:BZOJ3926、洛谷3346 题目大意: 给定一棵带权树,定义两个路径是不同的当且仅当两个路径上的权值构成的串不同,求本质不同的路径个数。 思路: 广义后缀自动机。 从每个叶子结点开始DFS,并依次加入到SAM中,对于每个加入的结点,last状态是其父亲节点所在的状态,其余插入过程与普通 阅读全文
摘要:
OJ题号: BZOJ4516 题目大意: 按顺序在一个序列的末尾插入数字,每次求出插入后能得到的本质不同的子串个数。 思路: 每次在SAM后加入这个数字,每次新出现的本质不同的子串个数就等于new_p->len-new_p->link->len。 由于数字范围比较大,可以考虑离散化或者map。 事实 阅读全文
摘要:
题目大意: 求多个字符串的LCS。 思路: 同SPOJ-LCS2,不过因为SPOJ上数据比较水,当时用错误的写法过掉了,这次用正确的写法重新过了一遍。 拓扑排序按照每个状态的len值,用计数排序实现。 每个状态往上更新时,应该对std::min(s[p].maxlen,s[q].len)取max(每 阅读全文
摘要:
题目大意: 给你一个字符串s,求出不同长度出现次数最多的字串的最大出现次数。 思路: 先对s构造后缀自动机,然后把s放进去匹配,每一个经过的结点表示一种长度的子串,用一个cnt记录能以每个状态表示的子串数量,然后按拓扑序DP。 注意拓扑序并不等同于在SAM中插入的次序,因为用new_q替代q的操作会 阅读全文