题意:找有多少种不同的单词
思路:字典树
每次插入一个单词都应find函数查找一遍,看是否存在,如果不存在sum++最后输出sum即可
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct Trie
{
bool flag;
struct Trie * child[26];
}Tri[8000000];
int alloc = 0;
struct Trie* creat_node()
{
Trie* p;
p = &Tri[alloc++];
int i;
p -> flag = false;
for(i = 0; i < 26; i++)
p -> child[i] = NULL;
return p;
}
void insert(Trie **p,char *str)
{
int i,len;
len = strlen(str);
Trie *q;
q = *p;
for(i = 0; i < len; i++)
{
if(q -> child[str[i]-'a'] != NULL)
{
q = q -> child[str[i]-'a'];
}
else
{
q -> child[str[i]-'a'] = creat_node();
q = q -> child[str[i]-'a'];
}
}
q -> flag = true;
}
bool find(Trie **q,char *str)
{
int i,len;
len = strlen(str);
struct Trie *p;
p = *q;
for(i = 0; i < len; i++)
{
if(p -> child[str[i]-'a'] != NULL)
{
p = p -> child[str[i]-'a'];
}
else
{
return false;
}
}
if(p ->flag == true)
return true;
else
return false;
}
int main()
{
char c[10000];
int sum = 0;
while(gets(c) != NULL && c[0] != '#')
{
int i;
alloc = 0,sum = 0;
char s[1000];
Trie * root;
root = creat_node();
char * tokstr = strtok(c," ");
while(tokstr != NULL)
{
sscanf(tokstr,"%s",s);
if(!find(&root,s))
{
sum++;insert(&root,s);
}
tokstr = strtok(NULL," ");
}
printf("%d\n",sum);
}
return 0;
}