多个串建SAM:
参考https://www.cnblogs.com/Xing-Ling/p/12038349.html。
把多个串离线存到tire树上,然后每个点的last是bfs树中父亲的cur。
然后建立SAM,其余与普通的SAM相同。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int M=1e6+7;
struct Trie{
int O,c[M],fa[M],tr[M][26];
//fa[x]: Trie树上x的父节点
//c[x]: Trie树上x的颜色
Trie(){O=1;}//根初始化为1
inline void insert(char ch[]){
int p=1;
for(int i=1;ch[i];++i){
int a=ch[i]-'a';
if(!tr[p][a])tr[p][a]=++O,fa[O]=p,c[O]=a;
p=tr[p][a];
}
}
}T1;
struct SAM {
int maxlen[M*2], trans[M*2][26], link[M*2], tg[M*2], size, last;
SAM() {
size = last = 1;
memset(tg,0,sizeof(tg));//注意这里要初始化tg
}
inline void extend(int id,int LAST) {
last=LAST;
int cur = (++ size), p;
tg[cur]=1;//标记当前点,表示当前集合包含原串的前缀
maxlen[cur] = maxlen[last] + 1;
for (p = las

这篇博客介绍了如何使用离线方法构建广义后缀自动机(广义SAM),通过将多个字符串存储到Trie树中,并利用BFS序增量方式建立SAM。参照了https://www.cnblogs.com/Xing-Ling/p/12038349.html的教程,每个节点的last指针指向BFS树中父节点的cur指针。
最低0.47元/天 解锁文章
945

被折叠的 条评论
为什么被折叠?



