普通字典树
题目思路:
建立一个普通字典树,每个节点内使用一个flag来统计该前缀出现次数即可
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef struct node{
int flag;//统计
struct node *next[26];
}Trie;
void insertTrie(Trie *root,char *c){
if(root==NULL||*c=='\0')
return;
Trie *p = root;
while(*c!='\0'){
if(p->next[*c-'a']==NULL){
Trie *q = (Trie *)malloc(sizeof(Trie));
q->flag=0;
for(int i=0;i<26;i++){
q->next[i]=NULL;
}
p->next[*c-'a']=q;
p=p->next[*c-'a'];
}
else{
p=p->next[*c-'a'];
}
p->flag+=1;//在此处更新flag,表示该前缀出现次数
c++;
}
}
int searchTrie(Trie *root,char *c){
Trie *p = root;
while(*c!='\0'){
if(p->next[*c-'a']!=NULL){
p=p->next[*c-'a'];
}
else return 0;
c++;
}
return p->flag;
}
int main(){
Trie *root = (Trie *)malloc(sizeof(Trie));
root->flag=0;
for(int i=0;i<26;i++){
root->next[i]=NULL;
}
char s[15];
while(1){
gets(s);
if(strcmp(s,"")==0)break;//输入空行结束
insertTrie(root,s);
}
while(scanf("%s",s)!=EOF){
printf("%d\n",searchTrie(root,s));
}
return 0;
}