![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
字符串-后缀自动机
brav0
练习算法两年半的ACM选手
展开
-
后缀自动机求多个串的公共子串数目
求n个串的本质不同公共子串的数目。我的做法是对第一个串构造sam,同时得到每个状态节点在原串的位置。然后对剩下的n-1的个串在第一个串的sam上跑,可以得到每个状态节点的最长匹配长度,这时候就得到了节点数目个区间,将区间合并,对这些区间形成的串再建一个广义后缀自动机,求出本质不同串的数目。#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef unsigned long long原创 2020-12-10 16:13:53 · 713 阅读 · 0 评论 -
求字符串中长度为k的本质不同串的个数
Names for BabiesLightOJ - 1314https://vjudge.net/contest/32333#problem/F问题:求字符串中长度为k的本质不同串的个数。思路:后缀自动机中每个节点包含着一段连续长度的子串,遍历每个节点,记一个差分数组即可统计长度为1~|S|的不同子串个数。代码:(LightOJ - 1314AC代码,原题统计长度p到q的本质不同子串的个数)#include <bits/stdc++.h>//#inc...原创 2020-06-22 16:06:17 · 795 阅读 · 0 评论 -
后缀自动机求本质不同串的数目
看了N年的后缀自动机才看懂。T.T还是我太菜了。计算一个串中的不同子串数目, 后缀数组也能写。讲道理, 后缀自动机的复杂度应该低于倍增后缀数组算法。结果发现几个算不同子串的后缀数组更快。QAQ(可能是n太小了, 但是1e7, 后缀自动机又开不下这么大数组, 测不了。)归入正题我们知道后缀自动机每个节点存的原串的子串, 且是连续的, 所以一个状态内的不同子串的数目即是, 我们又知...原创 2019-10-05 00:00:47 · 561 阅读 · 0 评论 -
后缀自动机求两个串的最长公共子串
假设有两个串分别为S, T求他们的最长公共子串我们先对S建立后缀自动机, 然后从S的起点u开始, 再记一个长度L, 添加T[1 ~ LenT]若存在子节点意味着添加当前字符后, 我们可以得到下一个状态,此时令状态u = next[u][c], L++.若不存在, 即不断跳lnk[u],直到有状态v满足next[v][c] != 0, 令u = next[v][c], L = le...原创 2019-10-07 01:18:01 · 617 阅读 · 0 评论 -
SPOJ - LCS2 Longest Common Substring II(求多个串的最长公共子串)
A string is finite sequence of characters over a non-empty finite set Σ.In this problem, Σ is the set of lowercase letters.Substring, also called factor, is a consecutive sequence of characters oc...原创 2019-10-09 00:59:49 · 315 阅读 · 0 评论