样例没过,28pts求调
查看原帖
样例没过,28pts求调
252549
Iwara楼主2024/4/24 16:43

RT

感觉自己写的很对啊/kk

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MAXN=2e5+5,SUM=30,MAXL=2e6+5;
ll n;
struct ACAM{
	ll trie[MAXN*SUM][SUM],tot;
	ll fail[MAXN*SUM],in[MAXN*SUM];
	ll cnt[MAXN*SUM],ans[MAXN];
	vector<ll> idx[MAXN*SUM];
	void insert(char *s,ll id){
		ll now=0;
		for(int i=1;s[i];i++){
			if(!trie[now][s[i]-'a'+1])trie[now][s[i]-'a'+1]=++tot;
			now=trie[now][s[i]-'a'+1];
		}
		idx[now].push_back(id);
		return;
	}
	queue<ll> q;
	void build(){
		for(int i=1;i<=26;i++)if(trie[0][i])q.push(trie[0][i]);
		while(q.size()){
			ll now=q.front();
			q.pop();
			for(int i=1;i<=26;i++){
				if(trie[now][i]){
					fail[trie[now][i]]=trie[fail[now]][i];
					in[trie[fail[now]][i]]++;
					q.push(trie[now][i]);
				}
				else trie[now][i]=trie[fail[now]][i];
			}
		}
		return;
	}
	void query(char *s){
		ll now=0;
		for(int i=1;s[i];i++){
			now=trie[now][s[i]-'a'+1];
			cnt[now]++;
		}
		return;
	}
	void solve(){
		for(int i=0;i<=tot;i++)if(in[i]==0)q.push(i);
		while(q.size()){
			ll now=q.front();
			q.pop();
			cnt[fail[now]]+=cnt[now];
			in[fail[now]]--;
			if(!in[fail[now]])q.push(fail[now]);
		}
		for(int i=0;i<=tot;i++)if(idx[i].size())for(ll x:idx[i])ans[x]=cnt[i];
		for(int i=1;i<=n;i++)cout<<ans[i]<<endl;
		return;
	}
}acam; 
char ch[MAXL];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>(ch+1);
		acam.insert(ch+1,i);
	}
	acam.build();
	cin>>(ch+1);
	acam.query(ch+1);
	acam.solve();
	return 0;
} 
2024/4/24 16:43
加载中...