社区讨论
萌新刚学ACAM EPS秒玄关求条
P5357【模板】AC 自动机参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mifuiibn
- 此快照首次捕获于
- 2025/11/26 18:12 3 个月前
- 此快照最后确认于
- 2025/11/26 19:19 3 个月前
52pts
C#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5,M=2e6+5;
int n;
namespace AC{
const int S=26;
struct Trie{
int d;
int id;
int cnt;
int fail;
int son[S];
Trie(){
cnt=id=0;
memset(son,0,sizeof son);
}
}tr[M];
int tot;
int idc;
int ans[N];
void init(){
tot=idc=0;
}
int newnode(){
return ++tot;
}
void insert(string s,int &id){
int u=0;
for(char i:s){
if(!tr[u].son[s[i]-'a'])tr[u].son[s[i]-'a'];
u=tr[u].son[s[i]-'a'];
}
if(!tr[u].id)tr[u].id=++idc;
id=tr[u].id;
}
void build(){
queue<int>q;
for(int i=0;i<S;i++)if(tr[0].son[i])q.push(tr[0].son[i]);
while(!q.empty()){
int u=q.front();q.pop();
for(int i=0;i<S;i++){
if(tr[u].son[i]){
tr[tr[u].son[i]].fail=tr[tr[u].fail].son[i];
tr[tr[tr[u].fail].son[i]].d++;
q.push(tr[u].son[i]);
}else tr[u].son[i]=tr[tr[u].fail].son[i];
}
}
}
void query(string s){
int u=0;
for(char i:s){
u=tr[u].son[i-'a'];
tr[u].cnt++;
}
}
void topo(){
queue<int>q;
for(int i=0;i<=tot;i++)if(!tr[i].d)q.push(i);
while(!q.empty()){
int u=q.front();q.pop();
ans[tr[u].id]+=tr[u].cnt;
tr[tr[u].fail].d--;
if(!tr[tr[u].fail].d)q.push(tr[u].fail);
}
}
}using namespace AC;
int id[N];
string t;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
string s;
cin>>s;
insert(s,id[i]);
}
build();
cin>>t;
query(t);
topo();
for(int i=1;i<=n;i++)cout<<ans[i]<<"\n";
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...