推荐:
AcWing 1282. 搜索关键词(Trie+KMP+bfs)
AcWing 1053. 修复DNA【线性DP+AC自动机模型+优化思路】
讲的很清楚,基本上把算法提高课这一节的内容,从KMP到AC自动机到优化版都讲明白了(虽然我还不是很懂但讲的比我好比我详细,强推!)
(而且我修复DNA的代码还是跟着打的…嗯可以直接看这俩链接不用往下看了
KMP求next数组:
next[0] = next[1] = 0;
for (int i = 2; i <= m; i++)
{
int j = next[i - 1];
while (j && p[i] != p[j + 1]) j = next[j];
if (s[i] == p[j + 1]) j++;
next[i] = j;
}
改成AC自动机时,将链式结构对应到树形结构,这里的一个字母对应同深度的所有节点,算第i层用到前i-1层信息,应该按深度遍历
while (队列不为空)
{
t = q[hh + 1];//对应第i - 1层
for (c = 0; c < 26; c++)//枚举儿子
{
ch = tr[t, c];//对应第i层
j = next[t];
while (j && !tr[j, c])//j的儿子不存在c
j = next[j];
if (tr[j, c]) j = tr[j, c];
next[ch] = j;
把ch加入队列
}
}
题目:AcWing1282. 搜索关键词
(没买算法提高课的别看了做不了)
代码:(手写queue写少了条件写成了h < t以及遍历时条件用了i < strlen(str)导致一直超时我真的不知道为啥T^T)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
const int N = 10005, M = 1000005, S = 55;
char str[M];
int ne[N*S], cnt[N*S], q[N*S];
int tr[N*S][26];
int idx;
void insert()
{
int p = 0;
for (int i = 0; str[i]; i++)
{
int c = str[i] - 'a';
if (!tr[p][c]) tr[p][c] = ++idx;
p = tr[p][c];
}
cnt[p]++;
}
void build()
{
int h = 0, t = -1;
for (int i = 0; i < 26; i++)
if (tr[0][i]) q[++t] = tr[0][i];
while (h <= t)
{
int x = q[h++];
for (int i = 0; i < 26; i++)
{
int ch = tr[x][i];
if (!ch) continue;
int j = ne[x];
while (j && !tr[j][i]) j = ne[j];
if (tr[j][i]) j = tr[j][i];
ne[ch] = j;
q[++t] = ch;
}
}
}
int main()
{
int T, n;
scanf("%d", &T);
while (T--)
{
idx = 0;
memset(tr, 0, sizeof tr);
memset(ne, 0, sizeof ne);
memset(cnt, 0, sizeof cnt);
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%s", str);
insert();
}
scanf("%s", str);
build(

文章详细讲解了算法提高课程中的Trie数据结构、KMP算法和AC自动机模型的应用,包括优化思路,以及如何在DNA修复问题中使用这些技术。作者提供了示例代码和关键步骤解析。
最低0.47元/天 解锁文章
1430

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



