zoukankan      html  css  js  c++  java
  • POJ2418 Hardwood Species(字典树+字符串排序)

    题目大意:给一个字符文本,每行一个字符串,统计不同的字符串出现的百分比。最后按ASCII排序输出不同字符串和出现的百分比。

    分析:对输入字符串建立字典树,在叶子结点记录该字符串出现的次数。这样的话,最后就可以查找每个字符串出现的次数。另外用一个数组记录不同的字符串,然后对其排序,输出结果。

    建字典树时要注意,题中没说出现的字符的范围,那就是所有字符都可能出现。数组应开成next[NODE][130].

    不知道为什么,用C++提交就AC,用G++提交就WA……,确实不太明白这二者有什么区别。

    View Code
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define N 10001
    #define LEN 31
    int next[N*LEN][130];
    int cnt[N*LEN];
    int node;
    
    char tree[N][LEN],s[LEN];
    int species,all;
    
    int cmp(const void *a,const void *b)
    {
        return strcmp((char *)a,(char *)b);
    }
    void init()
    {
        species=all=0;
        node=1;
        memset(next[0],0,sizeof(next[0]));
    }
    void add(int cur,int k)
    {
        memset(next[node],0,sizeof(next[node]));
        cnt[node]=0;
        next[cur][k]=node++;
    }
    void insert(char s[])
    {
        int i,k,cur;
        all++;
        for(i=cur=0;s[i];i++)
        {
            k=s[i];
            if(!next[cur][k])   add(cur,k);
            cur=next[cur][k];
        }
        if(!cnt[cur])   strcpy(tree[species++],s);
        cnt[cur]++;
    }
    int query(char s[])
    {
        int i,k,cur;
        for(i=cur=0;s[i];i++)
        {
            k=s[i];
            cur=next[cur][k];
        }
        return cnt[cur];
    }
    int main()
    {
        init();
        while(gets(s))  if(s[0])    insert(s);
        qsort(tree,species,sizeof(tree[0]),cmp);
        for(int i=0;i<species;i++)  printf("%s %.4lf\n",tree[i],(double)query(tree[i])/all*100);
        return 0;
    }
  • 相关阅读:
    js语法
    页面格式与布局
    css样式标签
    框架
    css样式表选择器
    最大值(东方化改题+老师给的题解)
    数字(东方化改题+老师给的正解)
    测试一下这个编辑器
    请让本题永远沉睡于此(东方化改题+给的标程)
    贪吃的yjj(东方化改题+给的标程)
  • 原文地址:https://www.cnblogs.com/algorithms/p/2608931.html
Copyright © 2011-2022 走看看