POJ 2418 Hardwood Species 经典字典树 统计单词出现次数

来源:互联网 发布:岛精程序员制版招聘 编辑:程序博客网 时间:2024/06/13 18:39

题意很简单:给一些单词,统计单词出现的频率(注意可以有多个单词一组,一行算一个单词)。

这题时间限制10s,map勉强过了。

#include<iostream>#include<string>#include<cstring>#include<cstdio>#include<map>using namespace std;int main(){//freopen("E:\\ACM\\test.txt","r",stdin);string s;map<string,double> m; //map会自动排序 map<string,double> ::iterator it;int n=0; while(getline(cin,s)){m[s]++;n++;}for(it=m.begin();it!=m.end();it++){cout<<it->first;printf(" %.4f\n",(it->second)*100/n); //注意如果这里用%lf 就 WA了。。 }return 0;}


接下来是字典树。看代码就懂:

#include<iostream>#include<string>#include<cstring>#include<cstdio>#include<vector>#include<algorithm>using namespace std;struct Tire{int num;   //统计单词出现的次数 char str[50]; //存放单词 Tire *next[256];Tire(){num=0;memset(next,0,sizeof(next));}}*root;char s[100];int n=0;void insert(char *s) //将单词插入到字典树中{Tire *p=root;for(int i=0;s[i];i++){int index=s[i];if(!p->next[index])p->next[index]=new Tire;p=p->next[index];}p->num++; //增加次数strcpy(p->str,s); //存储单词}void print(Tire *p) //这样是有序的,因为字典树本来就是按字母顺序建立的 {if(!p) return ;if(p->num)printf("%s %.4f\n",p->str,p->num*100.0/n);for(int i=0;i<256;i++){if(p->next[i]) print(p->next[i]);}}int main(){//freopen("E:\\ACM\\test.txt","r",stdin);root=new Tire;while(gets(s)){insert(s);++n;}print(root); //输出return 0;}