AC自动机求调,悬赏2关注
  • 板块学术版
  • 楼主Reinoran
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/3/10 09:11
  • 上次更新2023/10/23 22:03:32
查看原帖
AC自动机求调,悬赏2关注
145868
Reinoran楼主2023/3/10 09:11

rt
题目
WA on test2
test2与test1的区别是n不为1 求调qwq

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
struct node{
	int vis[27];//子节点 
	int fail;//失配指针 
	int end;
}p[N];
int cnt;//trie树当前节点编号 
inline void built(string s){//trie树建树 
	int l=s.length();
	int now=0;
	for(int i=1;i<=l;i++){
		if(p[now].vis[s[i]-'a']==0){
			p[now].vis[s[i]-'a']=++cnt;
		}
		now=p[now].vis[s[i]-'a'];
	}
	p[now].end++;
}
void get_fail(){//构建失配指针 
	queue<int>q;
	for(int i=0;i<=26;i++){//压入所有第二层节点 
		if(p[0].vis[i]!=0){
			p[p[0].vis[i]].fail=0;
			q.push(p[0].vis[i]);
		}
	}
	while(!q.empty()){//bfs 
		int u=q.front();
		q.pop();
		for(int i=0;i<=26;i++){
			if(p[u].vis[i]!=0){
				p[p[u].vis[i]].fail=p[p[u].fail].vis[i];
				q.push(p[u].vis[i]);
			}else{
				p[u].vis[i]=p[p[u].fail].vis[i];
			}
		}
	}
}
int query(string s){//查询 
	int l=s.length();
	int now=0,ans=0;
	for(int i=1;i<=l;i++){
	    now=p[now].vis[s[i]-'a'];
	    for(int t=now;t&&p[t].end!=-1;t=p[t].fail){
	        ans+=p[t].end;
	        p[t].end=-1;
	    }
	}
	return ans;
}
int main(){
	int n;
	string s,t;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>s;
		built(s);
	}
	p[0].fail=0;
	get_fail();
	cin>>t;
	cout<<query(t)<<endl;
	return 0;
}
2023/3/10 09:11
加载中...