社区讨论

有些不理解

P3121[USACO15FEB] Censoring G参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mi0vhoei
此快照首次捕获于
2025/11/16 06:43
3 个月前
此快照最后确认于
2025/11/16 13:39
3 个月前
查看原帖
在AC自动机跳转时,为什么一定要有
CPP
if (!top)
  rt = 0;
else
  rt = sign[top];
else 分支? 
解答必关orzorzorz
完整代码CPP
#include <bits/stdc++.h>
using namespace std;
string t[(int)1e5 + 5];
struct trie
{
    int ed;
    int ch[26];
    int fail;
} tree[(int)1e5 + 5];
int root = 0;
int tot = 0;
int ed[(int)1e5 + 5];
int sign[(int)1e5 + 5];
int ans[(int)1e5 + 5];
int top = 0;
inline int get(char x)
{
    return x - 'a';
}
int _insert(string &s)
{
    int rt = root;
    for (char x : s)
    {
        if (tree[rt].ch[get(x)] == 0)
        {
            tree[rt].ch[get(x)] = ++tot;
        }
        rt = tree[rt].ch[get(x)];
    }
    tree[rt].ed = s.size();
    return rt;
}
void build()
{
    queue<int> q;
    for (int i = 0; i < 26; i++)
    {
        if (tree[root].ch[i])
        {
            q.push(tree[root].ch[i]);
        }
    }
    while (!q.empty())
    {
        int rt = q.front();
        q.pop();
        for (int i = 0; i < 26; i++)
        {
            if (tree[rt].ch[i])
            {
                tree[tree[rt].ch[i]].fail = tree[tree[rt].fail].ch[i];
                q.push(tree[rt].ch[i]);
            }
            else
            {
                tree[rt].ch[i] = tree[tree[rt].fail].ch[i];
            }
        }
    }
}
void query(string &s)
{
    int rt = root;
    for (int i = 0; i < s.size(); i++)
    {
        rt = tree[rt].ch[get(s[i])];
        sign[++top] = rt;
        ans[top] = i;
        if (tree[rt].ed)
        {
            int len = tree[rt].ed;
            top -= len;
            if (!top)
                rt = 0;
            else
                rt = sign[top];
        }
    }
}
int main()
{
    string s;
    cin >> s;
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> t[i];
        ed[i] = _insert(t[i]);
    }
    build();
    query(s);
    for (int i = 1; i <= top; i++)
    {
        cout << s[ans[i]];
    }
    return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...