社区讨论

mxgxoi1ms , qz P3699 ACzdj qwq

灌水区参与者 2已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@lxo3edaf
此快照首次捕获于
2024/06/21 10:49
2 年前
此快照最后确认于
2024/06/21 17:35
2 年前
查看原帖
萌新刚学 OI 1ms,求助P3699 AC 自动机qwq
CPP
#include<bits/stdc++.h>
using namespace std;
int cnt[1000005],fail[1000005],n,siz;
int trie[2000005][26],ed[2000005],tot;
vector<int> edge[1000005];
char text[2000005];
inline void Add(string st){
	for(int i=0;i<st.size();i++){
		text[siz++]=st[i];
	}
	text[siz++]='&';
}
inline void insert(string st,int id){
	int pos=0;
	for(int i=0;i<st.size();i++){
		int ch=st[i]-'a';
		if(!trie[pos][ch]){
			trie[pos][ch]=++tot;
		}
		pos=trie[pos][ch];
	}
	ed[id]=pos;
}
inline void Getfail(){
	queue<int> Q;
	for(int i=0;i<26;i++){
		if(trie[0][i]){
			Q.push(trie[0][i]);
		}
	}
	while(!Q.empty()){
		int x=Q.front();
		Q.pop();
		for(int i=0;i<26;i++){
			if(trie[x][i]){
				fail[trie[x][i]]=trie[fail[x]][i];
				Q.push(trie[x][i]);
			}
			else{
				trie[x][i]=trie[fail[x]][i];
			}
		}
	}
}
inline void dfs(int pos){
	for(int i=0;i<edge[pos].size();i++){
		int to=edge[pos][i];
		dfs(to);
		cnt[pos]+=cnt[to];	
	}
}
inline void solve(){
	int pos=0;
	for(int i=0;i<strlen(text);i++){
		int ch=text[i]-'a';
		pos=trie[pos][ch];
		cnt[pos]++;
	}
	for(int i=1;i<=tot;i++){
		edge[fail[i]].push_back(i);
	}
	dfs(0);
	for(int i=1;i<=n;i++){
		cout<<cnt[ed[i]]<<endl;
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		string s;
		cin>>s;
		Add(s);
		insert(s,i);
	}
	Getfail();
	solve();
	return 0;
}
50pts TLE

回复

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

正在加载回复...