题意很简单:给一些单词,统计单词出现的频率(注意可以有多个单词一组,一行算一个单词)。
这题时间限制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;
}