博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ZOJ 10th Anniversary Contest - E
阅读量:5047 次
发布时间:2019-06-12

本文共 5398 字,大约阅读时间需要 17 分钟。

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

View Code
1 #include 
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 }

转载于:https://www.cnblogs.com/USTC-ACM/archive/2012/03/14/2395757.html

你可能感兴趣的文章
代码实现导航栏分割线
查看>>
Windows Phone开发(7):当好总舵主 转:http://blog.csdn.net/tcjiaan/article/details/7281421...
查看>>
VS 2010打开设计器出现错误
查看>>
SQLServer 镜像功能完全实现
查看>>
Vue-详解设置路由导航的两种方法
查看>>
一个mysql主从复制的配置案例
查看>>
大数据学习系列(8)-- WordCount+Block+Split+Shuffle+Map+Reduce技术详解
查看>>
dvwa网络渗透测试环境的搭建
查看>>
Win8 安装VS2012 和 Sql Server失败问题
查看>>
过点(2,4)作一直线在第一象限与两轴围成三角形,问三角形面积的最小值?...
查看>>
java aes CBC的填充方式发现
查看>>
使用ionic cordova build android --release --prod命令打包报有如下错误及解决方法
查看>>
BZOJ 2338 HNOI2011 数矩形 计算几何
查看>>
关于页面<!DOCTYPE>声明
查看>>
【AS3代码】播放FLV视频流的三步骤!
查看>>
C++标准库vector使用(更新中...)
查看>>
cocos2d-x 2.2.6 之 .xml文件数据读取
查看>>
枚举的使用
查看>>
BZOJ 1531 二进制优化多重背包
查看>>
BZOJ 2324 (有上下界的)费用流
查看>>