POJ 2418 字典树

题目链接:http://poj.org/problem?id=2418

题意:给定一堆树的名字,现在问你每一棵树[无重复]的出现的百分比,并按树名的字典序输出

思路:最简单的就是用map来写,关于字典树的解法,因为字典序的先序遍历是排序的,所以只需建好树后先序遍历一下树就可以满足题目要求的输出方式了。

坑点:树名会出现空格,而且题目也没说明可能出现的字符集合,所以树的孩子结点要有128个。 G++无限WA换C++就能AC,这个无解。。。

map:

#define _CRT_SECURE_NO_DEPRECATE
#include <iostream>
#include <string>
#include <cstdio>
#include <stdlib.h>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <time.h>
using namespace std;
typedef long long int LL;
char str[50];
map<string, int>word;
int main(){
    int n = 0;
    while (gets(str) != NULL){
        n++; string ss = string(str);
        word[ss]++;
    }
    for (map<string, int>::iterator it = word.begin(); it != word.end(); it++){
        cout << (it->first);
        printf(" %.4lf\n", (it->second)*1.0 / n*100.0);
    }
    return 0;
}

字典树:

#define _CRT_SECURE_NO_DEPRECATE
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <time.h>
using namespace std;
typedef long long int LL;
const int MAXN = 100000 + 5;
char str[50];
struct Trie{
    int val;
    int child[128];
    Trie(){
        val = 0;
        memset(child, 0, sizeof(child));
    }
}trie[MAXN];
int trieN, n;
void Insert(char *str){
    int d, x = 0;
    for (int i = 0; str[i]; i++){
        d = str[i];
        if (trie[x].child[d] == 0){
            trie[x].child[d] = ++trieN;
        }
        x = trie[x].child[d];
    }
    trie[x].val++;
}
void Search(int u, int len, char *str){
    for (int i = 0; i < 128; i++){
        if (trie[u].child[i]){
            str[len] = i;
            Search(trie[u].child[i], len + 1, str);
        }
    }
    if (trie[u].val){
        str[len] = ‘\0‘;
        printf("%s %.4lf\n", str, (trie[u].val*1.0 / n)*100.0);
    }
}
int main(){
    trieN = 0, n = 0;
    while (gets(str) != NULL){
        n++; Insert(str);
    }
    Search(0, 0, str);
    return 0;
}
时间: 2024-10-13 05:38:58

POJ 2418 字典树的相关文章

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>#incl

POJ 2503 字典树

这题记得以前是我们周赛的题,然后用的是map,也暴过了. 因为这两天要给大一的讲字典树,所以练练几道的代码,以防给大一搞晕了-- #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<queue> #include<set> #include<cmath> #include

poj 3764 字典树

The xor-longest Path Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7332   Accepted: 1555 Description In an edge-weighted tree, the xor-length of a path p is defined as the xor sum of the weights of edges on p: ⊕ is the xor operator. We

POJ 2001 字典树(入门题)

#include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #include<vector> #include<stack> #include<cmath> #include<queue> #include<map> using namespace std; struct Node { int c; int ne

POJ 2513 字典树+并查集+欧拉路径

Description: 给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相接的一边必须是相同颜色的. 解题思路: 可以用图论中欧拉路的知识来解这道题,首先可以把木棒两端看成节点,把木棒看成边,这样相同的颜色就是同一个节点 问题便转化为: 给定一个图,是否存在“一笔画”经过涂中每一点,以及经过每一边一次. 这样就是求图中是否存在欧拉路Euler-Path.(我才知道这个就是欧拉路径...T_T) 由图论知识可以知道,无向图存在欧拉路的充要条件为: ①    

POJ 2513(字典树hash+并查集+欧拉通路)

Colored Sticks Time Limit: 5000MS   Memory Limit: 128000K Total Submissions: 31015   Accepted: 8180 Description You are given a bunch of wooden sticks. Each endpoint of each stick is colored with some color. Is it possible to align the sticks in a st

[字典树] poj 2418 Hardwood Species

题目链接: http://poj.org/problem?id=2418 Hardwood Species Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 17511   Accepted: 6949 Description Hardwoods are the botanical group of trees that have broad leaves, produce a fruit or nut, and gene

POJ 2418 Hardwood Species(字典树)

题目链接:POJ 2418 Hardwood Species [题意]给出一大串树的名字,可能有重复,然后按字典序输出名字和百分比. [思路]我已开始偷懒用了map来做,这道题给的时间是10s,用map的8s也还是水过了,真是神奇啊,后来还是写了一下字典树,700ms+就过了,效率提升显著啊.这里要注意的是建字典树的ChildSize是256,题目输入不只有字母,还有一些其它字符. 下面贴上代码,先是map的: 1 /* 2 ** POJ 2418 Hardwood Species 3 ** C

POJ 2418 Hardwood Species(字典树 || map运用)

题目链接:http://poj.org/problem?id=2418 Description Hardwoods are the botanical group of trees that have broad leaves, produce a fruit or nut, and generally go dormant in the winter. America's temperate climates produce forests with hundreds of hardwood