题目:
Trie树一般用于找有相同前缀的单词集合,可以用字符串补全等。这里有26个英文字母,所以建立的Trie树是26叉树。root节点不存储字符和计数。
在建树的同时,对经过的节点进行计数。
参考其他人的代码手打了一遍,加了一些注释。
解答
#include<iostream>
#include<string>
using namespace std;
typedef struct trie{
int count;
char c;
struct trie* next[26];
}Trie;
int main(){
//头结点不存储c和count
Trie* root=new Trie;
for(unsigned i(0);i<26;i++){
root->next[i]=NULL;
}
int n,m;
string s;
cin>>n;
while(n--){
Trie* p=root;
cin>>s;
for(unsigned i(0);i<s.size();i++)
{
//哪一分支
unsigned j=s[i]-'a';
//不为空
if(p->next[j])
++p->next[j]->count;
else //新建结点
{
Trie* q=new Trie;
q->count=1;
q->c=s[i];
for(unsigned k(0);k<26;k++){
q->next[k]=NULL;
}
p->next[j]=q;
}
p=p->next[j];
}
}
cin>>m;
while(m--){
cin>>s;
//标记是否存在于字典
bool flag=false;
Trie* p=root;
for(unsigned i(0);i<s.size();i++){
unsigned j=s[i]-'a';
//为空,则不存在
if(!p->next[j]){
flag=true;
break;
}
p=p->next[j];
}
if(flag) cout<<'0'<<endl;
else cout<<p->count<<endl;
}
}