

1 #include<stdio.h>
2 #include<string.h>
3 #define MAXN 1001
4 struct node{
5 int data,left,right,parent;
6 node(){
7 data = -1;
8 left = -1;
9 right=-1;
10 parent=-1;
11 }
12 };
13 struct node huffT[MAXN],testT[MAXN];
14 char c[MAXN],a[MAXN];
15 int f[MAXN],heap[MAXN],m,n,WPL;
16 void read();
17 void insert(int x);
18 int del();
19 void Cwpl();
20 int test();
21 int main(){
22 int i;
23
24 read();
25 for(i=1;i<=m;i++){
26 if(test()==1) printf("Yes\n");
27 else printf("No\n");
28 }
29 return 0;
30 }
31 void read(){
32 int i;
33 scanf("%d",&n);
34 heap[0] =0;
35 for(i=1;i<=n;i++){
36 getchar();
37 scanf("%c %d",&c[i],&f[i]);
38 huffT[i].data = f[i];
39 huffT[i].left = -1;
40 huffT[i].right = -1;
41 huffT[i].parent = -1;
42 insert(i);
43 }
44 Cwpl();
45 scanf("%d",&m);
46 }
47 void insert(int x){
48 if(heap[0]==0){
49 heap[0]++;
50 heap[heap[0]] = x;
51 return;
52 }
53 int i,count,i1,i2;
54 heap[0]++;
55 heap[heap[0]] = x;
56 for(i=heap[0];i>1;i=i/2){
57 i1 = heap[i];
58 i2 = heap[i/2];
59 if(huffT[x].data< huffT[i2].data){
60 heap[i] = i2;
61 }
62 else break;
63 }
64 heap[i] = x;
65 }
66 int test(){
67 char tempc,tempcode[MAXN];
68 int i,j,tempwpl=0,flag=1,root=1,count=1,tempindex;
69 for(i=1;i<MAXN;i++){
70 testT[i].data = -1;
71 testT[i].left = -1;
72 testT[i].parent = -1;
73 testT[i].right = -1;
74 }
75 for(i=1;i<=n;i++){
76 getchar();
77 scanf("%c %s",&tempc,tempcode);
78 tempwpl += strlen(tempcode)*f[i];
79 tempindex = root;
80 for(j=0;j<strlen(tempcode);j++){
81 if(tempcode[j]=='1'){
82 if (testT[tempindex].right==-1){
83 testT[tempindex].right = ++count;
84 tempindex = count;
85 }
86 else tempindex = testT[tempindex].right;
87
88 }
89 else if(tempcode[j]=='0'){
90 if(testT[tempindex].left==-1){
91 testT[tempindex].left = ++count;
92 tempindex = count;
93 }
94 else tempindex = testT[tempindex].left;
95 }
96
97
98 if(j==strlen(tempcode)-1){
99 if(testT[tempindex].data==-1)
100 if(testT[tempindex].left==-1 && testT[tempindex].right==-1) testT[tempindex].data = f[i];
101 else flag=0;
102 else flag=0;
103 }
104
105 }
106 }
107
108
109 if(flag==0) return 0;
110 else{
111 if(tempwpl==WPL) return 1;
112 else return 0;
113 }
114 }
115 void Cwpl(){
116 int temp=0,count=n,value;
117 int i1,i2,i;
118
119 for(i=1;i<n;i++){
120 i1 = del();
121 i2 = del();
122 if(i1==-1 || i2==-1) break;
123 count++;
124 huffT[count].data = huffT[i1].data + huffT[i2].data;
125 huffT[count].left = i1;
126 huffT[count].right = i2;
127 huffT[count].parent = -1;
128 huffT[i1].parent = count;
129 huffT[i2].parent = count;
130 insert(count);
131 }
132
133 WPL=0;
134 for(i=1;i<=n;i++){
135 value = 0;
136 temp = huffT[i].parent;
137 while(temp!=-1){
138 value ++;
139 temp = huffT[temp].parent;
140 }
141 WPL += f[i]*value;
142 }
143 // printf("WPL: %d\n",WPL);
144
145
146 }
147
148 int del(){
149 int temp;
150 if(heap[0]==0) return -1;
151 temp = heap[1];
152 heap[1] = heap[heap[0]];
153 heap[0]--;
154 // adjust heap[1]
155 int i,value,i1,i2,index;
156 for(i=1;i<heap[0];){
157 if(i*2+1<=heap[0]){
158 i1 = heap[i*2];
159 i2 = heap[i*2+1];
160 if(huffT[i1].data>huffT[i2].data) index = i*2+1;
161 else index = i*2; ///
162 }
163 else if(i*2<=heap[0]) index = i*2;
164
165 if(huffT[heap[i]].data > huffT[heap[index]].data){
166 value = heap[i];
167 heap[i] = heap[index];
168 heap[index] = value;
169 i = index;
170 }
171 else break;
172
173 }
174 return temp;
175 }
来源:https://www.cnblogs.com/Learn-Excel/p/12643183.html
