代码:
#include<stdio.h>
#include<string.h>
//using namespace std;
int num[205] , n;
char op[205];
double p[205];
double dp[205][205];
int cases = 1;
int main(){
while(~scanf("%d" , &n)){
for(int i = 0 ; i <= n ; i ++){
scanf("%d" , &num[i]);
}
getchar();
for(int i = 1 ; i <= n ; i ++){
scanf("%c%*c" , &op[i]);
}
for(int i = 1 ; i <= n ; i ++){
scanf("%lf" , &p[i]);
}
for(int i = 0 ; i < 20 ; i ++){
if(num[0] & (1 << i)){
dp[0][i] = 1;
}
else{
dp[0][i] = 0;
}
}
for(int i = 1 ; i <= n ; i ++){
for(int j = 0 ; j < 20 ; j ++){
if(num[i] & (1 << j)){
if(op[i] == '^'){
dp[i][j] = dp[i - 1][j] * (p[i]) + (1 - dp[i - 1][j]) * (1 - p[i]);
}
else if(op[i] == '&'){
dp[i][j] = dp[i - 1][j];
}
else {
dp[i][j] = dp[i - 1][j] + (1 - dp[i - 1][j]) * (1 - p[i]);
}
}
else {
if(op[i] == '^'){
dp[i][j] = (dp[i - 1][j]);
}
else if(op[i] == '&'){
dp[i][j] = dp[i - 1][j] * (p[i]);
}
else {
dp[i][j] = dp[i - 1][j];
}
}
}
}
double ans = 0;
printf("Case %d:\n" , cases ++);
for(int i = 0 ; i < 20 ; i ++){
ans += dp[n][i] * (1 << i);
}
printf("%.6lf\n" , ans);
}
return 0;
}