社区讨论
为什么拓扑优化都是结构体存树啊
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 条回复,欢迎继续交流。
正在加载回复...