社区讨论

求调教

P3808AC 自动机(简单版)参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mhqm5gsl
此快照首次捕获于
2025/11/09 02:23
3 个月前
此快照最后确认于
2025/11/16 14:07
3 个月前
查看原帖
大佬求条
CPP
#include<bits/stdc++.h>
using namespace std;
long long n, ans, cnt, vis[1000005], x[1000005], a[1000005][26];
string s, t;
void f(string s){
	long long pos=0;
	for(auto i:s){
		if(!a[pos][i-'a']) a[pos][i-'a']=++cnt;
		pos=a[pos][i-'a'];
	}
	vis[pos]++;
}
void bfs(){
	queue<long long> q;
	for(long long i=0;i<26;i++){
		if(a[0][i]) q.push(a[0][i]);
		x[a[0][i]]=0;
	}
	while(q.size()){
		auto t=q.front();
		q.pop();
		for(long long i=0;i<26;i++){
			if(a[t][i]){
				x[a[t][i]]=a[x[t]][i];
				q.push(a[t][i]);
			}
			else a[t][i]=a[x[t]][i];
		}
	}
}
int main(){
//	freopen("P3808_2.in", "r", stdin);
//	freopen("P3808_2.ans", "w", stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(long long i=1;i<=n;i++){
		cin>>s;
		f(s);
	}
	cin>>t;
	long long c=0;
	for(long long i=0;i<t.size();i++){
		c=a[c][t[i]-'a'];
		for(long long j=c;j&&vis[j]!=-1;j=x[j]){
			ans+=vis[j], vis[j]=-1;
		}
	}
	cout<<ans;
	return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...