单词数
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 63793 Accepted Submission(s): 15905
Problem Description lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。
Input 有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。
Output 每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。
Sample Input
you are my friend #
Sample Output
4
Author Lily
Source
浙江工业大学网络选拔赛
Recommend
linle | We have carefully selected several similar problems for you: 1020 1075 2096 1247 1004
一开始用map过的 今天试试字典树
有点坑 字典树还是比较好弄的 就是输入麻烦
1." " 0 2." asdf as a" 3 3." asdf asdf ds" 2 4."asdf asdf " 1 5.直接输回车 0
还有一组关键的 a a a a a a
答案为1
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
const int MAX_N = 2000006;
int tree[MAX_N][30];
int cnt[MAX_N];
char str[MAX_N];
int tot;
void Insert(string str){
int len = str.length();
int root = 0;
for(int i = 0;i<len;++i){
int id = str[i]-'0';
if(!tree[root][id]) tree[root][id] = ++tot;
root = tree[root][id];
}
cnt[root]=1;
}
int Find(string str){
int len = str.length();
int root = 0;
for(int i = 0;i<len;++i){
int id = str[i] - '0';
if(!tree[root][id]) return 0;
root = tree[root][id];
}
return cnt[root];
}
void init(){
for(int i= 0;i<=tot;i++){
cnt[i] = 0;
for(int j =0;j<26;j++)
tree[i][j] = 0;
}
}
int main(){
tot = 0;
int num = 0;
string arr,str;
while(getline(cin,arr)&&arr[0]!='#'){
str="";
int len = arr.length();
for(int i= 0;i<len;++i){
if(isalpha(arr[i])){
int j ;
for(j=i;isalpha(arr[j]);j++)
str+=arr[j];
// printf("%s\n",str.c_str());
i = j;
if(!Find(str)) {
num++;
Insert(str);
}
str="";
}
}
cout << num << endl;
num = 0;
init();
}
return 0;
}