//f[p] = 1; 在建立字典树时,若当前节点是一个字符串的结束,标记为1
void build() {
queue<int>q;
for (int i = 0; i < 26; i++)if (st[0][i])q.emplace(st[0][i]);
while (!q.empty()) {
int k = q.front();
q.pop();
for (int i = 0; i < 26; i++) {
int p = st[k][i];
if (!p)st[k][i] = st[ne[k]][i];
else {
ne[p] = st[ne[k]][i];
q.emplace(p);
}
int t = p;
p = ne[p];
while (p && !f[p]) {//直接链接到最长有字符串的后缀对应前缀的节点
ne[t] = p;
p = ne[p];
}
}
}
}
AC自动机build时的一点小优化
最新推荐文章于 2024-03-15 14:10:50 发布