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;

}

 

你可能感兴趣的:(字符串)