#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
double dp[205][25];
double p[205];
char op[205];
int num[205];
int n;
void solve()
{
for(int i=1;i<=n;i++){
for(int j=0;j<=20;j++){
int tmp=(num[i]>>j)&1;
if(op[i]=='&'){
if(tmp) dp[i][j]=dp[i-1][j];
else dp[i][j]=dp[i-1][j]*p[i];
}
else if(op[i]=='|'){
if(tmp) dp[i][j]=dp[i-1][j]*p[i]+1-p[i];
else dp[i][j]=dp[i-1][j];
}
else {
if(tmp) dp[i][j]=dp[i-1][j]*p[i]+(1-p[i])*(1-dp[i-1][j]);
else dp[i][j]=dp[i-1][j];
}
}
}
}
int main()
{
int i,cas=1;
while(~scanf("%d",&n)){
memset(dp,0,sizeof(dp));
for(i=0;i<=n;i++)
cin>>num[i];
for(i=1;i<=n;i++)
cin>>op[i];
for(i=1;i<=n;i++)
scanf("%lf",&p[i]);
for(i=0;i<=20;i++)
dp[0][i]=(double)((num[0]>>i)&1);
solve();
double ret=0;
for(i=0;i<=20;i++){
ret+=(double)(1<<i)*dp[n][i];
}
printf("Case %d:\n%.6lf\n",cas++,ret);
}
return 0;
}
HDU-4649 dp压缩
最新推荐文章于 2020-05-17 10:44:24 发布