http://acm.hdu.edu.cn/showproblem.php?pid=2072
Problem Description
lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。
Input
有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。
Output
每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。
Sample Input
you are my friend
#
Sample Output
4
解题思路:这个题用map就可以很容易的解决了,由于最近在练字典树,就用它来写了一下,至于要在插入时记录一下是不是新出现的单词,如果是ans++,否则就继续插入下一个就可以了。
#include <bits/stdc++.h>
using namespace std;
struct Trie
{
int is_str;
Trie *child[26];
Trie()
{
is_str = 0;
for(int i=0;i<26;i++)
child[i] = NULL;
}
};
Trie *root,*current,*temp;
int ans = 0;
void insert(string str)
{
current = root;
for(int i=0;i<str.length();i++)
{
if(current->child[str[i]-'a']==NULL){
temp = new Trie;
current->child[str[i]-'a'] = temp;
current = current->child[str[i]-'a'];
}
else
current = current->child[str[i]-'a'];
}
if(!current->is_str){
current->is_str = 1;
ans++;
}
}
void del(Trie *root)
{
for(int i=0;i<26;i++)
if(root->child[i]!=NULL)
del(root->child[i]);
delete(root);
}
int main()
{
string str;
while(getline(cin,str))
{
ans = 0;
root = new Trie;
if(str.length()==1&&str[0]=='#')
break;
stringstream ss(str);
string s;
while(ss>>s)
{
insert(s);
}
printf("%d\n",ans);
}
return 0;
}