怎么利用自动机求多个串的最长公共子串

来源:百度知道 编辑:UC知道 时间:2024/06/26 05:47:37
网上有说用后缀数组求最长公共子串方法,但觉得还是慢,后来看了自动机,但觉得都是模式匹配,或只有两个串匹配,到底怎么处理多个串呢,如果把一个做为DFA,其它做为模式,岂不慢死了,有高手会吗,请教教我吧

求多串最长公共子串可以用后缀自动机解决问题。
(我就当你已经会写后缀自动机了。不会也可以去学学。)
先建立一个串的后缀自动机,然后再去拿其他串往里面跑一遍。
只不过在维护节点的信息时,要多设两个int:minf,maxg。
minf表示该节点在全局中的最小匹配长度(多串的公共子串当然是取交集)。
maxg表示该节点在当前串种的最大匹配长度(对于单串,当然是取最大值)。
即:
struct SAM
{
int step, pre, minf, maxg, son[26];
}h[N << 1]; //N为串的长度。
然后跑自动机的代码(我是自己写的,不能保证正确性,不过应该差不多了):
void Travel(char *s)
{
int slen = strlen(s), u = 0, len = 0;
for (int i = 0; i < slen; i++)
{
int j = s[i] - 'A';
if (h[u].son[j])
len++, u = h[u].son[j];
else
{
while (u && !h[u].son[j])
u = h[u].pre;
if (!u && !h[u].son[j])
len = 0;
else
{
len = h[u].step + 1;
u = h[u].son[j];
}
}
h[u].ma