SuperCowHorse @ 2022-08-12 14:20:19
RT。52pts,WA on #2,3,4。
#include<bits/stdc++.h>
using namespace std;
const int maxn=3e6+5;
struct trie{
int nex[maxn][63],cnt,tot[maxn];
bool ex[maxn];
int to_num(char c){
if(c>='A'&&c<='Z')
return c-'A';
if(c>='a'&&c<='z')
return c-'a'+26;
return c-'0'+52;
}
void insert(char *s,int l){
int p=0;
for(int i=0;i<l;++i){
int c=to_num(s[i]);
if(!nex[p][c])
nex[p][c]=++cnt;
p=nex[p][c];++tot[p];
}
ex[p]=1;
}
int find(char *s,int l){
int p=0;
for(int i=0;i<l;++i){
int c=to_num(s[i]);
if(!nex[p][c]) return 0;
p=nex[p][c];
}
return tot[p];
}
void init(){
for(int i=1;i<=cnt;++i)
for(int j=1;j<=62;++j)
nex[i][j]=ex[i]=0;
for(int i=1;i<=cnt;++i)
tot[i]=0;
cnt=0;
}
}t;
int T,n,q;
char s[maxn];
int main(){
scanf("%d",&T);
while(T--){
t.init();
scanf("%d%d",&n,&q);
for(int i=1;i<=n;++i){
scanf("%s",s);
t.insert(s,strlen(s));
}
while(q--){
scanf("%s",s);
printf("%d\n",t.find(s,strlen(s)));
}
}
}
by LKY928261 @ 2022-08-12 15:18:21
《红名萌新》
问:代码中的 ex
数组表示什么?
by SuperCowHorse @ 2022-08-12 15:19:36
@lvkaiyi0811 该结点结尾的字符串是否存在
by SuperCowHorse @ 2022-08-12 15:19:53
看的 OI-wiki
by LKY928261 @ 2022-08-12 15:23:12
改:
void init(){
for(int i=1;i<=cnt;++i)for(int j=0;j<62;++j)nex[i][j]=ex[i]=0;
for(int i=1;i<=cnt;++i)tot[i]=0;
cnt=0;
}
你的标号是从 0 开始的。
by LKY928261 @ 2022-08-12 15:27:53
@chenye3
by SuperCowHorse @ 2022-08-12 15:50:54
@lvkaiyi0811 AC了。
void init(){
for(int i=0;i<=cnt;++i)for(int j=0;j<62;++j)nex[i][j]=ex[i]=0;
for(int i=0;i<=cnt;++i)tot[i]=0;
cnt=0;
}
by SuperCowHorse @ 2022-08-12 15:51:12
谢谢dalao