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

 

posted @ 2012-07-25 20:45  BeatLJ  阅读(819)  评论(0编辑  收藏  举报