社区讨论

为什么拓扑优化都是结构体存树啊

P5357【模板】AC 自动机参与者 2已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@miai93m8
此快照首次捕获于
2025/11/23 00:30
4 个月前
此快照最后确认于
2025/11/23 12:41
4 个月前
查看原帖
突然不知道数组存法怎么改了
CPP
#include<bits/stdc++.h>
using namespace std;
const int M=1e6+5,N=1e6+5;
int n,ch[N][26],cnt,nxt[M],ans[N],in[N];
vector<int>tg[N];
string str[N];
void build_tree(string s,int idx)
{
    int k=0;
    for(int i=0;i<s.size();i++)
    {
        int c=s[i]-'a';
        if(!ch[k][c])ch[k][c]=++cnt;
        k=ch[k][c];
    }
    tg[k].push_back(idx);
}
void build_AC()
{
    queue<int>q;
    for(int i=0;i<26;i++)
    {
        if(ch[0][i])q.push(ch[0][i]);
    }
    while(!q.empty())
    {
        int k=q.front();
        q.pop();
        for(int i=0;i<26;i++)
        {
            if(ch[k][i])
            {
                nxt[ch[k][i]]=ch[nxt[k]][i];
                in[ch[nxt[k]][i]]++;
                q.push(ch[k][i]);
            }
            else ch[k][i]=ch[nxt[k]][i];
        }
    }
}
void query(string s)
{
    int T=0;
    for(int i=0;i<s.size();i++)
    {
        int c=s[i]-'a';
        T=ch[T][c];
        for(int j=T;j;j=nxt[j])
        {
            for(auto u:tg[j])
            {
                ans[u]++;
            }
        }
    }
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>str[i];
        build_tree(str[i],i);
    }
    build_AC();
    cin>>str[0];
    query(str[0]);
    for(int i=1;i<=n;i++)cout<<ans[i]<<"\n";
    return 0;
}

回复

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

正在加载回复...