e......
DESCRIPTION:
给你许多种名字可以重复。要求你统计每种名字的比例。按照字典序输出每种名字及其所占比例、可以用字典树快速存储,输出大量字符串。
也可以用map。但是。map不太熟。输出好烦。为什么key值是字符数组的时候只能用Cout不能是printf。也不能用各种字符数组的函数呢。什么鬼!T_T用完C++还有编译器C++WA。G++AC。>_<。
附代码:
map:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<iomanip>
#include<map>
using namespace std;
int main()
{
char word[45];
map<string, int>m;
map<string, int>::iterator iter;
m.clear();
int cnt = 0;
while (gets(word))
{
m[word]++;
cnt++;
}
for (iter=m.begin(); iter != m.end(); ++iter)
{
double temp = iter->second*100.0;
//printf("%s %.4f\n",t, iter->first, temp/cnt);
cout<<setiosflags(ios::fixed)<<setprecision(4)<<iter->first<<" "<<100.0*(iter->second)/cnt<<endl;
}
return 0;
}
字典树:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#define maxn 172
using namespace std;
struct Tree
{
Tree *nxt[maxn];
int num;
char name[45];
bool isleaf;
Tree()
{
for (int i=0; i<maxn; ++i)
{
nxt[i] = NULL;
}
num = 0;
isleaf = false;
}
}Root;
int cnt = 0;
void creatTree(char str[])
{
int len = strlen(str);
Tree *root = &Root;
for (int i=0; i<len; ++i)
{
int temp = int (str[i]);
if (root->nxt[temp] == NULL)
{
root->nxt[temp] = new Tree;
}
root = root->nxt[temp];
}
strcpy(root->name, str);
root->num++;
root->isleaf = true;
}
void f_put(Tree *p)
{
if (p->isleaf)
printf("%s %.4f\n", p->name, p->num*100.0/cnt);
for (int i=0; i<maxn; ++i)
{
if (p->nxt[i])
f_put(p->nxt[i]);
}
}
int main()
{
char str[45];
while (gets(str))
{
creatTree(str);
cnt++;
}
Tree *now = &Root;
f_put(now);
return 0;
}