HDU2072 单词数(字典树)

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;
}

猜你喜欢

转载自blog.csdn.net/Hc_Soap/article/details/107618805