HDU - 2072 单词数 (字典树||set)
HDU - 2072 单词数 (字典树)
lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。
Input
有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。
Output
每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。
Sample Input
you are my friend
Sample Output
4
解题思路:
题意很简单,就是统计不同单词的数量。
这个题用stl库里的set能很好地解决
也可以用字典树解决,是一个字典树的入门题。
我们只要修改一下字典树的add函数就可以了。
字典树中的flag[i]表示i这个节点是否作为终止节点。
如果我们插入一个单词,他的最后一个字母的flag为0 说明之前没有到这个地方的,就ans++。
注意这个输入的时候可以用stringstream ss(s); 这个是把s赋给ss然后
while(ss>>tmp){add(tmp);}
就能把s里的单词一个一个的摘出来了,头文件是 sstream
AC代码:
#include
#include
#include
#include
#include
#define ll long long
using namespace std;
const int maxn = 2e5+10;
int tree[maxn][30];//30取决于字母的个数,第i个节点的第j个孩子
int tot = 0;
ll ans = 0;
bool flag[maxn];//标号为i的是否为一个字符串的最后一个
void add(string s){int root = 0;int id;int len = s.size();for(int i=0;i<len;i++){id = s[i]-'a';//这个字母是几if(!tree[root][id]) tree[root][id] = ++tot;root = tree[root][id];}if(!flag[root]){ans++; }flag[root] = true;//这是个字符串
}bool find(char *s){int root = 0;int id;int len = strlen(s);for(int i=0;i<len;i++){id = s[i]-'a';if(!tree[root][id]) return false;root = tree[root][id];}if(flag[root]) return true;else return false;
}
void init(){memset(tree,0,sizeof(tree));memset(flag,0,sizeof(flag));tot = 0;ans = 0;
}
int main(){string s,tmp;std::ios::sync_with_stdio(0);while(getline(cin,s)){if(s[0]=='#') break;stringstream ss(s);while(ss>>tmp){add(tmp);} cout<<ans<<endl;init();}return 0;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
