ZOJ 10th Anniversary Contest - E

此题是非常典型的表达式求值问题,既然只有最多15个变量,那就枚举每一种变量的取值代入计算,如果全部相等则认为两个表达式相等。

View Code
  1 #include <stdio.h>
2
3 char ve[500][50];
4 long x[500],vnum,pfs,pf;
5
6 int tran(char c){
7
8 if (c==')')
9 return 0;
10
11 if (c=='^')
12 return 1;
13
14 if (c=='|')
15 return 2;
16
17 if (c=='&')
18 return 3;
19
20 if (c=='!')
21 return 4;
22
23 if (((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A')))
24 return 7;
25
26 return -1;
27 }
28
29 long cal(long z[],long pz,long r[],long pr){
30
31 if (z[pz]==4){
32
33 r[pr]=!r[pr];
34 return pr;
35 }
36
37 if (z[pz]==3){
38
39 r[pr-1]=r[pr]&r[pr-1];
40 return pr-1;
41 }
42
43 if (z[pz]==2){
44
45 r[pr-1]=r[pr]|r[pr-1];
46 return pr-1;
47 }
48
49 if (z[pz]==1) {
50
51 r[pr-1]=r[pr]^r[pr-1];
52 return pr-1;
53 }
54
55 return pr;
56 }
57
58 long finds(char s[],long p,long max){
59
60 char ss[50];
61 long i,j,j1,w;
62
63 for (i=0;(i<=max)&&(tran(s[p])==7);i++,p++){
64
65 ss[i]=s[p];
66 }
67 pfs=p-1;
68
69 ss[i]=0;
70
71 for (j=1;j<=vnum;j++){
72
73 w=0;
74
75 for (j1=0;ss[j1]==ve[j][j1];j1++){
76
77 if (ss[j1]==0){
78
79 w=1;
80 break;
81 }
82 }
83
84 if (w){
85
86 return x[j];
87 }
88
89 }
90
91
92 return -1;
93 }
94
95 long find(char s[],long p,long max){
96
97 long zo[5000],zn[5000],on,nn,i,j;
98
99 on=0;
100 nn=0;
101
102 zn[0]=0;
103 zo[0]=-1;
104
105 for (i=p;i<=max;i++){
106
107 if (s[i]=='('){
108
109 nn++;
110 zn[nn]=find(s, i+1,max);
111 i=pf;
112
113 continue;
114 }
115
116 j=tran(s[i]);
117
118 if (j==7){
119
120 nn++;
121 zn[nn]=finds(s,i,max);
122 i=pfs;
123
124 continue;
125 }
126
127 if ((j>=0)&&(j<=4)){
128
129 while (zo[on]>j){
130
131 nn=cal(zo, on, zn, nn);
132 on--;
133 }
134
135 on++;
136 zo[on]=j;
137
138 if (j==0){
139
140 pf=i;
141
142 return zn[nn];
143 }
144 }
145 }
146
147 pf=i;
148 return 0;
149 }
150
151 int main (){
152
153 char s1[5000],s2[5000];
154 long i,j,l1,l2,k,le,re1,re2,relast;
155
156 while (1){
157
158 i=1;
159 if (scanf("%c",s1+i)==EOF)
160 break;
161
162 if (s1[i]=='\n'){
163
164 break;
165 }
166 else{
167
168 while (s1[i]!='\n'){
169
170 i++;
171 if (scanf("%c",s1+i)==EOF)
172 return 0;
173 }
174 }
175
176 l1=i;
177 s1[l1]=')';
178 s1[0]='(';
179
180 i=1;
181 if (scanf("%c",s2+i)==EOF)
182 return 0;
183
184 while (s2[i]!='\n'){
185
186 i++;
187 if (scanf("%c",s2+i)==EOF)
188 return 0;
189 }
190
191 l2=i;
192
193 s1[0]='(';
194 s2[l2]=')';
195
196 vnum=0;
197
198 for (i=0;i<=l1;i++){
199
200 if (((s1[i]<='z')&&(s1[i]>='a'))||((s1[i]<='Z')&&(s1[i]>='A'))){
201
202 vnum++;
203 for (j=0;((s1[i]<='z')&&(s1[i]>='a'))||((s1[i]<='Z')&&(s1[i]>='A'));j++,i++){
204
205 ve[vnum][j]=s1[i];
206 }
207
208 ve[vnum][j]=0;
209 }
210 }
211
212 relast=1;
213
214 for (k=0;;k++){
215
216 le=k;
217
218 for (i=1;i<=vnum;i++){
219
220 x[i]=le%2;
221 le=le/2;
222 }
223
224 if (le)
225 break;
226
227 re1=find(s1,1,l1);
228 re2=find(s2,1,l2);
229
230 if (re1!=re2){
231
232 relast=0;
233 break;
234
235 }
236 }
237
238 if (relast==1){
239
240 printf("TRUE\n");
241 }
242 else{
243
244 printf("FALSE\n");
245 }
246
247 }
248 return 0;
249 }



posted @ 2012-03-14 13:09  ustc-acm  阅读(211)  评论(0编辑  收藏  举报