看来不少人的写法
最后还是按这种写吧
还有一点字典树开头不保留字母,同理不统计数目
一种是数组的;
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int trie[1000010][26]; //数组形式定义字典树,值存储的是下一个字符的位置
int num[1000010]={0}; //附加值,以某一字符串为前缀的单词的数量
int pos = 1; //pos的个数代表不重复字母的个数
void Insert(char word[])
{
int i;
int c=0;
for(int i=0;word[i];i++){
int n=word[i]-'a';
if(trie[c][n]==0)
trie[c][n]=pos++;
c=trie[c][n];
num[c]++;
}
}
int Find(char word[])
{
int i;
int c=0;
for(int i=0;word[i];i++){
int n=word[i]-'a';
if(trie[c][n]==0)
return 0;
c=trie[c][n];
}
return num[c];
}
int main()
{
char word[11];
while(gets(word)){
if(word[0]==NULL)
break;
Insert(word);
}
while(gets(word)){
printf("%d\n",Find(word));
}
return 0;
}
第二种
代码如下
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct Trie
{
Trie *next[26];
int num;
Trie(){
for(int i=0;i<26;i++)
next[i]=NULL;
num=0;
}
} ;
Trie root;
void Insert(char word[])
{
Trie *p=&root;
for(int i=0;word[i];i++){
if(p->next[word[i]-'a']==NULL)
p->next[word[i]-'a']=new Trie;
p=p->next[word[i]-'a'];
p->num++;
}
}
int Find(char word[])
{
Trie *p=&root;
for(int i=0;word[i];i++){
if(p->next[word[i]-'a']==NULL)
return 0;
p=p->next[word[i]-'a'];
}
return p->num;
}
int main()
{
char word[12];
while(gets(word)){
if(word[0]==NULL)
break;
Insert(word);
}
while(gets(word)){
printf("%d\n",Find(word));
}
return 0;
}