HDU 2072 - 单词数 - [(有点小坑的)字典树模板题]
题目链接: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
题解:
简单的方法可以直接用set容器。
当然也可以用字典树来做。
小坑的地方是有如下数据:
(直接输入引号内的内容)
1.
" "
0
2.
" asdf as a"
3
3.
" asdf asdf ds"
2
4.
"asdf asdf "
1
5.
直接输回车
0
AC代码(set):
#include<bits/stdc++.h> using namespace std; const int maxn=1e3+10; char str[maxn],s[32]; set<string> S; int main() { while(1) { gets(str); if(str[0]=='#') break; S.clear(); int len=strlen(str); for(int i=0,tot=0;i<len;i++) { if(isalpha(str[i])) { s[tot++]=str[i]; if(i+1==len || str[i+1]==' ') { s[tot]='\0'; S.insert(s); } } else tot=0; } cout<<S.size()<<endl; } }
AC代码(字典树):
#include<bits/stdc++.h> using namespace std; const int maxn=1e3+10; namespace Trie { const int SIZE=maxn*32; int sz; struct TrieNode { bool ed; int nxt[26]; }trie[SIZE]; void init() { sz=1; memset(trie,0,sizeof(trie)); } int insert(const string& s) { int p=1; for(int i=0;i<s.size();i++) { int ch=s[i]-'a'; if(trie[p].nxt[ch]==0) trie[p].nxt[ch]=++sz; p=trie[p].nxt[ch]; } if(trie[p].ed) return 0; else return trie[p].ed=1; } }; char str[maxn],s[32]; int main() { while(1) { gets(str); if(str[0]=='#') break; int ans=0; Trie::init(); int len=strlen(str); for(int i=0,tot=0;i<len;i++) { if(isalpha(str[i])) { s[tot++]=str[i]; if(i+1==len || str[i+1]==' ') { s[tot]='\0'; ans+=Trie::insert(s); } } else tot=0; } cout<<ans<<endl; } }
转载请注明出处:https://dilthey.cnblogs.com/