题意:统计树的种类出现的百分率,给你树木的名字(可能有重复,最多100W个数据,种类不超过1W),数目名字的长度不超过30,但是可能包含空格,也可能包含别的字符(所以需要把struct 开到 ch[130], RE被坑了多次,最终AC)
用字典树做或者是用map,目前只做了字典树版本的,以后map填坑。。
Time Limit: 10000MS | Memory Limit: 65536K | |
Total Submissions: 21246 | Accepted: 8344 |
Description
Input
Output
Sample Input
Red Alder Ash Aspen Basswood Ash Beech Yellow Birch Ash Cherry Cottonwood Ash Cypress Red Elm Gum Hackberry White Oak Hickory Pecan Hard Maple White Oak Soft Maple Red Oak Red Oak White Oak Poplan Sassafras Sycamore Black Walnut Willow
Sample Output
Ash 13.7931 Aspen 3.4483 Basswood 3.4483 Beech 3.4483 Black Walnut 3.4483 Cherry 3.4483 Cottonwood 3.4483 Cypress 3.4483 Gum 3.4483 Hackberry 3.4483 Hard Maple 3.4483 Hickory 3.4483 Pecan 3.4483 Poplan 3.4483 Red Alder 3.4483 Red Elm 3.4483 Red Oak 6.8966 Sassafras 3.4483 Soft Maple 3.4483 Sycamore 3.4483 White Oak 10.3448 Willow 3.4483 Yellow Birch 3.4483
Hint
Source
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<iostream> int num ; char ss[10005][32]; char s[1000005][32]; struct node { int size; node *ch[130]; node() { size = 0; for(int i = 0 ; i < 130 ; i++) { ch[i] = NULL; } } }; int cmp(const void *s1,const void * s2) { return strcmp((char *)s1,(char *)s2); } node *root = new node; //node root[100005]; node *current,*newnode; void INSERT(char *s,int x) { int len = strlen(s); int i,m; current = root; for(i = 0 ; i < len ;i++) { m = (int)s[i]; // if(s[i]>='A'&&s[i]<='Z') // m = s[i]-'A'; // else if(s[i]==' ') // m = 27; // else // m = s[i]-'a'; if(current->ch[m]!=NULL) { current = current->ch[m]; (current->size)++; } else { newnode = new node; (newnode->size)++; current->ch[m] = newnode; current = newnode; if(i == len-1) { strcpy(ss[num],s); num++; } } } } int QUERY(char *s) { int i,m; current = root; for(i = 0 ; i < strlen(s);i++) { // if(s[i]>='A'&&s[i]<='Z') // m = s[i]-'A'; // else if(s[i]==' ') // m = 27; // else // m = s[i]-'a'; m = (int)s[i]; current = current->ch[m]; } return current->size; } using namespace std; int main() { int N; N = 0; num = 0; // while(~scanf("%s",s[N])&&strcmp(s[N],"")) while(gets(s[N])) { INSERT(s[N],N); N++; } qsort(ss,num,sizeof(ss[0]),cmp); int ans; for(int i = 0 ; i < num; i++) { printf("%s %.4lf\n",ss[i],(double)QUERY(ss[i])/N*100); } return 0; } /* Red Alder Ash Aspen Basswood Ash Beech Yellow Birch Ash Cherry Cottonwood Ash Cypress Red Elm Gum Hackberry White Oak Hickory Pecan Hard Maple White Oak Soft Maple Red Oak Red Oak White Oak Poplan Sassafras Sycamore Black Walnut Willow Sample Output Ash 13.7931 Aspen 3.4483 Basswood 3.4483 Beech 3.4483 Black Walnut 3.4483 Cherry 3.4483 Cottonwood 3.4483 Cypress 3.4483 Gum 3.4483 Hackberry 3.4483 Hard Maple 3.4483 Hickory 3.4483 Pecan 3.4483 Poplan 3.4483 Red Alder 3.4483 Red Elm 3.4483 Red Oak 6.8966 Sassafras 3.4483 Soft Maple 3.4483 Sycamore 3.4483 White Oak 10.3448 Willow 3.4483 Yellow Birch 3.4483 */