题目
trie模板题,询问存不存在,有没有重复询问
分析
因为容易理解,贴伪代码
void pusht(char *s){
int len=strlen(s),p=1;
for (register int k=0;k<len;k++){
int c=s[k]-97;
if (!trie[p][c]) trie[p][c]=++tot;
p=trie[p][c];
}
end[p]=1;
}
int search(char *s){
int len=strlen(s),p=1;
for (int k=0;k<len;k++){
p=trie[p][s[k]-97];
if (!p) return 0;
}
return end[p];
}
代码
#include <cstdio>
#include <cstring>
int trie[500001][26],tot,n,end[500001]; char s[51];
void pusht(char *s){
int len=strlen(s),p=1;
for (register int k=0;k<len;k++){
int c=s[k]-97;
if (!trie[p][c]) trie[p][c]=++tot;//新建点
p=trie[p][c];
}
end[p]=1;
}
int search(char *s){
int len=strlen(s),p=1;
for (int k=0;k<len;k++){
p=trie[p][s[k]-97];//下一个位置
if (!p) return 0;
}
if (end[p]) end[p]++;//同时用来累计次数
return end[p]-1;
}
int main(){
scanf("%d\n",&n);
while (n--){
scanf("%s",s+1);
pusht(s+1);
}
scanf("%d\n",&n);
while (n--){
scanf("%s",s+1);
int flag=search(s+1);
if (flag<1) puts("WRONG");//不存在
else if (flag==1) puts("OK");//只询问1次
else puts("REPEAT"); //重复询问
}
return 0;
}
本文介绍了一道关于Trie树的数据结构题目,通过提供Trie树插入与查找的伪代码,展示了如何利用Trie树解决字符串存储及查询的问题,并区分了字符串是否存在的判断与重复查询的计数。
803

被折叠的 条评论
为什么被折叠?



