求助AC自动机全T
  • 板块灌水区
  • 楼主A_grasser
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/8/9 20:18
  • 上次更新2024/8/9 20:33:54
查看原帖
求助AC自动机全T
966803
A_grasser楼主2024/8/9 20:18

https://www.luogu.com.cn/problem/P3808

全T,1.20ms

#include<bits/stdc++.h>
using namespace std;
int n,cnt;
struct point{
	int son[30],fail;
	int final;
}trie[1000010];
void inser(char x[]){
	int len=strlen(x),pos=1,k;
	for(int i=0;i<len;i++){
		k=x[i]-'a';
		if(trie[pos].son[k]==0){
			trie[pos].son[k]=++cnt;
		} 
		pos=trie[pos].son[k];
	}
	trie[pos].final++;
}
queue<int>q;
int fail(int x){
	return trie[x].fail;
}
void bulid(){
	for(int i=0;i<26;i++){
		trie[0].son[i]=1;
	}
	trie[1].fail=0;
	q.push(1);
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=0;i<26;i++){
			int v=trie[u].son[i];
			if(v==0){
				trie[u].son[i]=trie[fail(u)].son[i];
			}
			else{
				trie[v].fail=trie[fail(u)].son[i];
				q.push(v);
			}
		}
	}
}
//wait for study under
int find(char x[]){
	int len=strlen(x),pos=1,ans=0,k;
	for(int i=0;i<len;i++){
		k=trie[pos].son[(int)(x[i]-'a')];
		while(k!=0 && trie[k].final!=-1){
			ans+=trie[k].final;
			trie[k].final=-1;
			k=fail(k);
		}
		pos=trie[pos].son[(int)(x[i]-'a')];
	}
	return ans;
}
//
int main(){
	scanf("%d",&n);
	char x[1000010];
	for(int i=1;i<=n;i++){
		scanf("%s",x);
		inser(x);
	}
	bulid();
	scanf("%s",x);
	printf("%d",find(x));
	return 0;
}

2024/8/9 20:18
加载中...