求助33分
查看原帖
求助33分
305296
云雷心柠檬听楼主2023/6/29 12:09
#include<bits/stdc++.h>
using namespace std;
const int V=100009;
struct Node{
	int son[26];
	int fail;
	int end;
} trie[V];
#define son(u,i) trie[u].son[i]
#define fail(u) trie[u].fail
#define end(u) trie[u].end
int nTrie,hst[V*26];
char txt[V],ptn[V],ans[V],len[V*26];

void input(){
	scanf("%s",txt+1);
}

void buildACA(){
	queue<int> q;
	for(int i=0;i<26;i++){
		if(son(0,i)) q.push(son(0,i));
	}
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=0;i<26;i++){
			int &v=son(u,i);
			int w=son(fail(u),i);
			if(v){
				q.push(v);
				fail(v)=w;
			}
			else{
				v=w;
			}
		}
	}
}

void addTrie(char* str){
	int lenStr=strlen(str+1);
	int u=0;
	for(int i=1;i<=lenStr;i++){
		int &v=son(u,str[i]-'a');
		if(!v) v=++nTrie;
		u=v;
	}
	len[u]=lenStr;
	end(u)=1;
}

void solve(){
	int lenT=strlen(txt+1);
	int nPtn;
	cin>>nPtn;
	for(int i=1;i<=nPtn;i++){
		scanf("%s",ptn+1);
		addTrie(ptn);
	}
	buildACA();
	int lenAns=0;
	int u=0;
	for(int i=1;i<=lenT;i++){
		ans[++lenAns]=txt[i];
		u=son(u,txt[i]-'a');
		hst[lenAns]=u;
		if(!end(u)) continue;
		lenAns-=len[u];
		u=hst[lenAns];
	}
	for(int i=1;i<=lenAns;i++) cout<<ans[i];
	cout<<endl;
}

int main(){
	input();
	solve();
	return 0; 
}

AC了四个点

思路是AC自动机

2023/6/29 12:09
加载中...