单词数Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 21020 Accepted Submission(s): 5077
Problem Description
lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。
Input
有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。
Output
每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。
Sample Input
Sample Output
Author
Lily
Source
Recommend
linle
|
=====================================算法分析=====================================
Trie树。
=======================================代码=======================================
#include<ctype.h>
#include<stdio.h>
#include<string.h>
struct TrieNode { bool exist; TrieNode *next[26]; };
TrieNode * NewNode()
{
TrieNode *tmp=new TrieNode;
memset(tmp,0,sizeof(TrieNode));
return tmp;
}
bool Insert(TrieNode *Root,char *Word)
{
for(int i=0;Word[i];++i)
{
int j=Word[i]-'a';
if(Root->next[j]==NULL) Root->next[j]=NewNode();
Root=Root->next[j];
}
return Root->exist?false:Root->exist=true;
}
void EmptyTree(TrieNode *Root)
{
if(Root!=NULL)
{
for(int i=0;i<26;++i)
{
EmptyTree(Root->next[i]);
}
Root->exist=false;
}
}
int main()
{
TrieNode *Root=NewNode();
char Str[105],Word[105];
while(gets(Str)!=NULL&&strcmp(Str,"#"))
{
EmptyTree(Root);
int i=0,cnt=0;
while(Str[i])
{
if(islower(Str[i]))
{
int j;
for(j=0;islower(Str[i]);++j)
{
Word[j]=Str[i++];
}
Word[j]=0;
cnt+=Insert(Root,Word);
}
else
{
++i;
}
}
printf("%d\n",cnt);
}
return 0;
}