struct 很占内存吗?
  • 板块学术版
  • 楼主LargeRice16pro
  • 当前回复16
  • 已保存回复16
  • 发布时间2023/8/30 01:23
  • 上次更新2023/11/3 00:24:45
查看原帖
struct 很占内存吗?
225100
LargeRice16pro楼主2023/8/30 01:23
#include<bits/stdc++.h>
#define pb push_back
#define For(i,a,b) for(i=a;i<=b;i++)
using namespace std;
const int N=1e5+10,M=3e6+5;
typedef long long ll;
string t[N],s[N];
int opt[N];
struct Bit{
	int tr[M];
	void init(){
		memset(tr,0,sizeof tr);
	}
	int lowbit(int x){
		return x&(-x);
	}
	void update(int x,int y){
		for(;x<M;x+=lowbit(x)) tr[x]+=y;
	}
	int query(int x){
		int res=0;
		for(;x;x-=lowbit(x)) res+=tr[x];
		return res;
	}
};
struct Trie{
	int root,son[M][26],idx;
	Bit tree_a;	
	int L[M],R[M];
	void init(){
		int i,j;
		tree_a.init();
		memset(son,0,sizeof son);
		idx=0; 
	}
	void insert(string &s,int x,int p){
		while(x<s.size()){
			if(!son[p][s[x]-'a']) son[p][s[x]-'a']=++idx;
			p=son[p][s[x]-'a'];
			x++;
		}
	}
	void add(string &s,int x,int p){
		while(x<s.size()){
			p=son[p][s[x]-'a'];
			x++;	
		}
		tree_a.update(L[p],1);
		tree_a.update(R[p]+1,-1);	
	}
};
struct ACAM{
	Trie trie;
	int nex[M],Idx;
	vector<int> p[M];
	queue<int> q;
	void init(){
		int i;
		For(i,0,trie.idx) p[i].clear();
		trie.init();
		Idx=0;
		memset(nex,0,sizeof nex);
	}
	void add(int u,int v){
		p[u].pb(v);
	}
	void dfs(int x){
		trie.L[x]=++Idx;
		for(auto u:p[x]) dfs(u);
		trie.R[x]=Idx;
	}
	void build(){
		int i;
		For(i,0,25) if(trie.son[0][i]) q.push(trie.son[0][i]);
		while(q.size()){
			auto t=q.front();
			q.pop();
			For(i,0,25){
				auto u=trie.son[t][i];
				if(!u) trie.son[t][i]=trie.son[nex[t]][i];
				else{
					nex[u]=trie.son[nex[t]][i];	
					q.push(u);
				}
			}
		}
		For(i,1,trie.idx) add(nex[i],i);
		dfs(0);
		trie.tree_a.init();
	}
	ll query(string &s){
		int i,j=0,len=s.size();
		ll res=0;
		For(i,0,len-1){
			j=trie.son[j][s[i]-'a'];
			res+=trie.tree_a.query(trie.L[j]);
		}
		return res;
	}
}acam;
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	int T,n,m,i;
	cin>>T;
	while(T--){
		acam.init();
		cin>>n>>m;
		For(i,1,n) cin>>t[i];
		For(i,1,n) acam.trie.insert(t[i],0,acam.trie.root);
		For(i,1,m){
			cin>>opt[i]>>s[i];
			if(opt[i]==1) acam.trie.insert(s[i],0,acam.trie.root);
		}
		acam.build();
		For(i,1,n) acam.trie.add(t[i],0,acam.trie.root);
		For(i,1,m){
			if(opt[i]==1) acam.trie.add(s[i],0,acam.trie.root);
			if(opt[i]==2) cout<<acam.query(s[i])<<'\n';
		}
	}
	return 0;
}
2023/8/30 01:23
加载中...