单词数
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 66379 Accepted Submission(s): 16707
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: 2074 2054 2052 2024 2058
#include<bits/stdc++.h>
#define ll long long
#define dprintf if (debug) printf
#define rep(i, j, k) for (int i=j; i<k; i++)
using namespace std;
const int maxn = 1e5;
string s;
int tot, ans;
int T[maxn][30], sum[maxn];
void insert(string s){
int len = s.length();
int rt = 0;
rep(i, 0, len){
int id = s[i] - 'a';
if (!T[rt][id]){
T[rt][id] = ++tot;
}
if (!sum[T[rt][id]] && i==len-1){
ans++;
}
rt = T[rt][id];
}
sum[rt]++;
}
//求前缀在字典树中出现的次数
int find_suffix(string s){
int len = s.length();
int rt = 0;
int ans = 0;
rep(i, 0, len){
int id = s[i] - 'a';
if (!T[rt][id]) return 0;
rt = T[rt][id];
}
return sum[rt];
}
void trieInit(){
ans = 0;
memset(T, 0, sizeof(T));
}
int main(){
while (getline(cin,s) && s!="#"){
trieInit();
stringstream SS(s);
while (SS>>s){
insert(s);
}
printf("%d\n", ans);
}
}
find_suffix没用
至于怎么调试Trie,主要给前缀的数据,贴一个HDU的discuss里面的
1." " 0 2." asdf as a" 3 3." asdf asdf ds" 2 4."asdf asdf " 1 5.直接输回车 0 这些过了,基本就过了~~祝大家AC