[?] 字典树

发布时间 2023-07-17 20:18:26作者: FJOI

模板在此

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=3e6+110;
int read(){
	int x=0,f=1;char c=getchar();
	while(c>'9' || c<'0'){if(c=='-')f=-1;c=getchar();}
	while(c>='0' && c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	return x*f;
}
int T,n,q,t[N][65],rt,newpos,cnt[N];char s[N];
int tn(char sc){
	if(sc>='A' && sc<='Z')return sc-'A'+1;
	if(sc>='a' && sc<='z')return sc-'a'+1+26;
	if(sc>='0' && sc<='9')return sc-'0'+1+26+26;
	return 0;
}
void Clear(int u){
	for(int i=1;i<=26+26+10;i++){
		if(t[u][i]){
			Clear(t[u][i]);
			t[u][i]=0;
		}
	}
	return;
}
void solve(){
	for(int i=1;i<=newpos;i++)cnt[i]=0;Clear(rt);
	rt=newpos=1;
	n=read(),q=read();
	for(int i=1;i<=n;i++){
		scanf("%s",s);int len=strlen(s),np=rt;
		for(int j=0;j<len;j++){
			int w=tn(s[j]);
			if(t[np][w])np=t[np][w];
			else np=t[np][w]=++newpos;
			cnt[np]++;
		}
	}
	for(int i=1;i<=q;i++){
		scanf("%s",s);int len=strlen(s),np=rt,flag=1;
		for(int j=0;j<len;j++){
			int w=tn(s[j]);
			if(t[np][w])np=t[np][w];
			else{flag=0;break;}
		}
		if(flag)printf("%d\n",cnt[np]);
		else printf("0\n");
	}
	return;
}
int main(){
	T=read();
	while(T--)solve();
	return 0;
}