求卡常
  • 板块学术版
  • 楼主Brainless_zxc
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/6/19 17:13
  • 上次更新2024/6/19 17:16:44
查看原帖
求卡常
661274
Brainless_zxc楼主2024/6/19 17:13
#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
int cnt=1,n,tot;
struct oi{
	int son[30],jc,tail;
}tree[1000010],ban[1000010];
inline void jian(string t){
	int u=1;
	for(register int i=0;i<t.size();i++){
		if(!tree[u].son[t[i]-'a']||ban[u].son[t[i]-'a']!=tot){
			tree[u].son[t[i]-'a']=++cnt;
			ban[u].son[t[i]-'a']=tot;
		}
		u=tree[u].son[t[i]-'a'];
	}
	if(ban[u].jc!=tot){
		tree[u].jc=1;
		ban[u].jc=tot;
	}
	else{
		tree[u].jc++;
	}
	return;
}
queue<int> q;
inline void get(){
	while(!q.empty()){
		q.pop();
	}
	for(register int i=0;i<26;i++){
		tree[0].son[i]=1;
		ban[0].son[i]=tot;
	}
	q.push(1);tree[1].tail=0;
	ban[1].tail=tot;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(register int i=0;i<26;i++){
			int v=tree[u].son[i];
			if(ban[u].son[i]!=tot){
				v=0;
			}
			if(!v){
				tree[u].son[i]=tree[tree[u].tail].son[i];
				ban[u].son[i]=tot;
				continue;
			}
			tree[v].tail=tree[tree[u].tail].son[i];
			ban[v].tail=tot;
			q.push(v);
		}
	}
	return;
}
inline int sum(string s){
	int ans=0,u=1;
	for(register int i=0;i<s.size();i++){
		int v=s[i]-'a';
		int k=tree[u].son[v];
		int last=ans;
		while(k&&(!(tree[k].jc==-1&&ban[k].jc==tot))){
			if(ban[k].jc!=tot){
				tree[k].jc=0;
			}
			ans+=tree[k].jc;
			tree[k].jc=-1;
			ban[k].jc=tot;
			k=tree[k].tail;
		}
		u=tree[u].son[v];
	}
	return ans;
}
char t[1000010];
signed main(){
	freopen("hack.in","r",stdin);
	cin.tie(0);cout.tie(0);
	ios::sync_with_stdio(0);
	int T;
	cin>>T;
	while(T--){
		cnt=1;
		cin>>n;
		for(register int i=1;i<=n;i++){
			cin>>t;
			jian(t);
		}
		get();
		cin>>t;
		cout<<sum(t)<<'\n';
		tot++;
	} 
	return 0;
}

把这个题

的每个点都卡到1秒以内!!!

(阴暗爬行)

2024/6/19 17:13
加载中...