POJ 2418 字典树 or map

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;
}

你可能感兴趣的:(map)