HDU2072 单词数(字典树)
Description
lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。
Input
有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。
Output
每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。
Sample Input
you are my friend
Sample Output
4
题意
题意很简单,找出一句话里有几个不同的单词。取出句子中的各个单词插入字典树,利用Insert函数的性质来计算有几个不同的单词,相当于模板题。
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<stack>
#include<vector>
#include<algorithm>
#include<functional>
#include<map>
#include<sstream>
//#include<unordered_map>
#define lowbit(x) ((x)&-(x));
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e6+10,NN=1e3+10,INF=0x3f3f3f3f;
const ll MOD=1e9+7;
const ull seed=31;
struct Trie{
Trie *Next[26];
int num;
Trie(){
for(int i=0;i<26;i++) Next[i]=NULL;
num=0;
}
};
int num;
void Insert(string str,Trie &root){
Trie *p=&root;
for(int i=0;i<str.size();i++){
if(p->Next[str[i]-'a']==NULL) p->Next[str[i]-'a']=new Trie;
p=p->Next[str[i]-'a'];
}
p->num++;//在最后一个指向的空间++num,防止产生重复
if(p->num==1) ++num;
}
void init(){
num=0;
}
int main(){
string str,temp;
while(getline(cin,str)){
Trie root;
init();
if(str=="#") break;
istringstream ss(str);
while(ss>>temp) Insert(temp,root);
printf("%d\n",num);
}
return 0;
}