题目大意:给一个字符文本,每行一个字符串,统计不同的字符串出现的百分比。最后按ASCII排序输出不同字符串和出现的百分比。
分析:对输入字符串建立字典树,在叶子结点记录该字符串出现的次数。这样的话,最后就可以查找每个字符串出现的次数。另外用一个数组记录不同的字符串,然后对其排序,输出结果。
建字典树时要注意,题中没说出现的字符的范围,那就是所有字符都可能出现。数组应开成next[NODE][130].
不知道为什么,用C++提交就AC,用G++提交就WA……,确实不太明白这二者有什么区别。

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