刚学ac自动机,why 20??
查看原帖
刚学ac自动机,why 20??
740329
sunaohua楼主2023/3/14 11:16

help

#include<bits/stdc++.h>
using namespace std;
struct tree{
	int vis[26];
	int end;
	int fail;
	int hh;
}ak[100005];
int cnt=0;
int st[100005],h=0;
void build(string s){
	int now=0;
	for(int i=0;i<s.length();i++){
	if(!ak[now].vis[s[i]-'a']){
	ak[now].vis[s[i]-'a']=++cnt;
	}
	now=ak[now].vis[s[i]-'a'];
	}
	ak[now].end=1;
//	cout<<now<<" ";
//	cout<<endl;
}
void get_fail(){
	queue<int> q;
	for(int i=0;i<26;i++){
	if(ak[0].vis[i]){
	q.push(ak[0].vis[i]);
	ak[ak[0].vis[i]].fail=0;
	ak[ak[0].vis[i]].hh=1;
	}
	}
	while(!q.empty()){
	int u=q.front();
	q.pop();
	for(int i=0;i<26;i++){
	if(ak[u].vis[i]){
	ak[ak[u].vis[i]].fail=ak[u].fail;
	ak[ak[u].vis[i]].hh=ak[u].hh+1;
	q.push(ak[u].vis[i]);
	}
	else
	ak[u].vis[i]=ak[ak[u].fail].vis[i];
	}
	}
}
char to[100005];int n;
void ak_query(string s){
	int now=0;
	st[0]=0;h=0;
	for(int i=1;i<=s.length();i++){
	now=ak[now].vis[s[i-1]-'a'];
	h++;
//	cout<<i<<" "<<h<<" "<<now<<" "<<s[i-1]-'a'<<" "<<s[i-1]<<endl;
	st[h]=now;
	to[h]=s[i-1];
	if(ak[now].end){
//	cout<<i<<" "<<now<<" "<<ak[now].hh<<"*"<<endl;
	h-=ak[now].hh;
	now=st[h];
	}
	}
}
int main(){
	string ss,s;
	cin>>ss;
	cin>>n;
	for(int i=1;i<=n;i++){
	cin>>s;
	build(s);
	}
	get_fail();
	ak_query(ss);
	int i=0;
	for(int i=1;i<=h;i++)
	cout<<to[i];
	return 0;
}
2023/3/14 11:16
加载中...