首页 > 代码库 > poj2418(Hardwood Species)
poj2418(Hardwood Species)
题目地址 : Hardwood Species
题目大意:
给你多组字符串,算出其占所有给出字符串占的比重。
解题思路:
字典树,将每个字符的最后一个字符的节点里count++。 最后求出count/sum。 即可。关键是字符串的输出。因为存到字典树里的值就是本身字符的ASCII码值,所以最后输出的时候,i(0->MAX)判断有没有该节点,有的将i 赋值到一个字符串即可。
代码:
1 #include <algorithm> 2 #include <iostream> 3 #include <sstream> 4 #include <cstdlib> 5 #include <cstring> 6 #include <cstdio> 7 #include <string> 8 #include <bitset> 9 #include <vector> 10 #include <queue> 11 #include <stack> 12 #include <cmath> 13 #include <list> 14 //#include <map> 15 #include <set> 16 using namespace std; 17 /***************************************/ 18 #define ll long long 19 #define int64 __int64 20 #define PI 3.1415927 21 /***************************************/ 22 const int INF = 0x7f7f7f7f; 23 const double eps = 1e-8; 24 const double PIE=acos(-1.0); 25 const int d1x[]= {0,-1,0,1}; 26 const int d1y[]= {-1,0,1,0}; 27 const int d2x[]= {0,-1,0,1}; 28 const int d2y[]= {1,0,-1,0}; 29 const int fx[]= {-1,-1,-1,0,0,1,1,1}; 30 const int fy[]= {-1,0,1,-1,1,-1,0,1}; 31 /*vector <int>map[N];map[a].push_back(b);int len=map[v].size();*/ 32 /***************************************/ 33 void openfile() 34 { 35 freopen("data.in","rb",stdin); 36 freopen("data.out","wb",stdout); 37 } 38 priority_queue<int> qi1; 39 priority_queue<int, vector<int>, greater<int> >qi2; 40 /**********************华丽丽的分割线,以上为模板部分*****************/ 41 const int MAX=150; 42 struct Trie 43 { 44 Trie *next[MAX]; //存储下一层 45 int v; //存储到此有多少相同前缀的数目 46 int count; 47 }; 48 Trie *root; 49 int sum; 50 int d=0; 51 char str[35]= {‘\0‘}; 52 void creatTrie(char s[]) 53 { 54 Trie *p,*q; 55 p=root; 56 int len=strlen(s); 57 for(int i=0; i<len; i++) 58 { 59 int ce=s[i]; 60 if (p->next[ce]==NULL) 61 { 62 q=(Trie *)malloc(sizeof(Trie)); 63 q->v=1; 64 for(int j=0; j<MAX; j++) 65 { 66 q->next[j]=NULL; 67 q->count=0; 68 } 69 p->next[ce]=q; 70 p=p->next[ce]; 71 } 72 else 73 { 74 p->v++; 75 p=p->next[ce]; 76 } 77 } 78 p->v=-1; 79 p->count++; 80 } 81 int find(char s[]) 82 { 83 int len=strlen(s); 84 Trie *p=root; 85 for(int i=0; i<len; i++) 86 { 87 int ce=s[i]; 88 p=p->next[ce]; 89 if (p==NULL) 90 return 0; 91 if (p->v==-1) 92 return 1; 93 } 94 return 1; 95 } 96 void outp(Trie *T) 97 { 98 if (T->count!=0) 99 {100 for(int j=0;j<d;j++)101 printf("%c",str[j]);102 printf(" %.4lf\n",(double)(T->count)/(double)sum*100.0);103 }104 for(int i=0; i<MAX; i++)105 if (T->next[i]!=NULL)106 {107 str[d]=i;108 d++;109 outp(T->next[i]);110 d--; //树的构造,-1到上一层的d值。111 }112 }113 int dealTrie(Trie *T)114 {115 if (T==NULL)116 return 0;117 for(int i=0; i<MAX; i++)118 if (T->next[i]!=NULL)119 dealTrie(T->next[i]);120 free(T);121 return 0;122 }123 int main()124 {125 char s[35];126 root=(Trie *)malloc(sizeof(Trie));127 for(int i=0; i<MAX; i++) //初始化128 {129 root->next[i]=NULL;130 root->count=0;131 }132 while(gets(s))133 {134 if (s[0]==0)135 break;136 sum++;137 creatTrie(s);138 }139 outp(root);140 dealTrie(root);141 return 0;142 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。