P8306 【模板】字典树 来自一个poor的警示
查看原帖
P8306 【模板】字典树 来自一个poor的警示
670495
ColaPig楼主2024/8/18 21:07

千万别用memset进行clear,会TLE,我在这卡了一个多小时

顺带帖一下自己的代码,不是很好看别喷

#include<bits/stdc++.h>
using namespace std;
int nex[3000005][70],cnt,t,n,q;
char s[3000005];
int exist[3000005];
	
int getnum(char x){
    if(x>='A'&&x<='Z')
	   	return x-'A';
    else if(x>='a'&&x<='z')
        return x-'a'+26;
    else
		return x-'0'+52;
}
	
void insert(char* s){
	int p=0;
	int l=strlen(s);
	for(int i=0;i<l;i++){
		int c=getnum(s[i]);
		if(!nex[p][c]) nex[p][c]=++cnt;
		p=nex[p][c];
		exist[p]++;
	}
}
	
int find(char* s){
	int l=strlen(s);
	int p=0;
	for(int i=0;i<l;i++){
		int c=getnum(s[i]);
		if(!nex[p][c]) return 0;
		p=nex[p][c];
	}
	return exist[p];
}
int main(){
	cin>>t;
	while(t--){
		for(int i=0;i<=cnt;i++)
            for(int j=0;j<=122;j++)
                nex[i][j]=0;
        for(int i=0;i<=cnt;i++)
            exist[i]=0;
		cnt=0;
		scanf("%d%d",&n,&q);
        for(int i=1;i<=n;i++){
            scanf("%s",s);
            insert(s);
        }
        for(int i=1;i<=q;i++){
            scanf("%s",s);
            printf("%d\n",find(s));
        }
	}
	
}
2024/8/18 21:07
加载中...