萌新刚学OI,偶遇AC自动机(简单版)50pts,求调
  • 板块学术版
  • 楼主wry0001
  • 当前回复2
  • 已保存回复2
  • 发布时间2025/7/23 20:58
  • 上次更新2025/7/24 10:46:40
查看原帖
萌新刚学OI,偶遇AC自动机(简单版)50pts,求调
1344614
wry0001楼主2025/7/23 20:58

原题

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6+5;
char t[N];
char c[N];int clen = 1;
char s[N]; 
vector<int> G[N];
int num[N];int lp[N];
bool vis[N];
int n;
int ans;
void sp(int fa,int u){
	int pos = lp[fa];
	for(unsigned int i = 0;i < G[pos].size();i++){
		if(c[u] == c[G[pos][i]]&&u != G[pos][i]){
			lp[u] = G[pos][i];
		}
	}
	for(unsigned int i = 0;i < G[u].size();i++){
		int v = G[u][i];
		sp(u,v);
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
//	freopen("P3808_2.in","r",stdin);
	cin >> n;
	for(int i = 1;i <= n;i++){
		cin >> t;
		int k = strlen(t);
		int pos = 0;
		
		for(int j = 0;j < k;j++){
			c[clen+j] = t[j];
			bool change = false;
			for(unsigned int o = 0;o < G[pos].size();o++){
				if(c[G[pos][o]] == t[j]){
					pos = G[pos][o];
					change = true;
					break;
				}
			}
			if(!change){
				G[pos].push_back(clen+j);
				pos = clen+j;
			}
			
		}
		num[pos]++;
		clen += k;
	}
	for(unsigned int i = 0;i < G[0].size();i++){
		sp(0,G[0][i]);
	}
//	for(int i = 1;i <= clen;i++) cout << num[i] << " ";
//	cout << '\n';
//	for(int i = 1;i <= clen;i++) cout << lp[i] << " ";
//	cout << '\n';
	cin >> s;
	int	k = strlen(s);
	int i = 0;
	int pos = 0;
	while(i < k){
		bool b = true;
//		cout << i << " " << pos << "   ";
		for(unsigned int j = 0;j < G[pos].size();j++){
			int v = G[pos][j];
			if(c[v] == s[i]){
				b = false;
				pos = v;
				break;
			}
//			cout << c[v] << " " << s[i] << "  "; 
		}
//		cout << '\n';
		if(b&&pos == 0){
			i++;
		}
		else if(!b){
			i++;
			if(!vis[pos]){
				vis[pos] = true;
				ans += num[pos];
			}
		}
		else{
			pos = lp[pos];
		}
		
	}
	cout << ans;
	return 0;
}

2025/7/23 20:58
加载中...