玲珑OJ 1152

来源:互联网 发布:jessyline姐妹品牌js 编辑:程序博客网 时间:2024/05/16 19:39

题目链接


显然可以拆位,20个位单独考虑
dp[i][j]=iOiAi,j1
dp[i][j]=dp[i1][j]+(1dp[i1][j])(1pi)           Oi= or (ai>>j) and 1=1
dp[i][j]=dp[i1][j]pi              Oi=and(ai>>j) and 1=0
dp[i][j]=dp[i1][j]pi+(1dp[i1][j])(1pi)               Oi=xor(ai>>j)and 1=1

#include<stdio.h>#include<bits/stdc++.h>#define ll long long#define pii pair<int,int>#define pll pair<ll,ll>#define MEM(a,x) memset(a,x,sizeof(a))#define lowbit(x) ((x)&-(x))using namespace std;const int N = 1000+5;double p[N];int a[N];char o[N];double d[2][22];double dp(int n){    MEM(d,0);    double *d1=d[0],*d2=d[1];    for(int i=0;i<=20;++i){        if((a[0]>>i)&1){            d1[i]=1;        }    }    for(int i=1;i<=n;++i){        for(int j=0;j<=20;++j){            d2[j]=d1[j];            if(((a[i]>>j)&1)&&o[i]=='|'){                d2[j]=d1[j]+(1-d1[j])*(1-p[i]);            }            if(!((a[i]>>j)&1)&&o[i]=='&'){                d2[j]=d1[j]*p[i];            }            if(((a[i]>>j)&1)&&o[i]=='^'){                d2[j]=d1[j]*p[i]+(1-d1[j])*(1-p[i]);            }        }        swap(d1,d2);    }    double ans=0;    int t=1;    for(int i=0;i<=20;++i){        ans+=d1[i]*t;        t*=2;    }    return ans;}int main(){    //freopen("/home/lu/code/r.txt","r",stdin);    //freopen("/home/lu/code/w1.txt","w",stdout);    int n;    while(~scanf("%d",&n)){        for(int i=0;i<=n;++i){            scanf("%d",&a[i]);        }        for(int i=1;i<=n;++i){            scanf("%*c%c",&o[i]);        }        for(int i=1;i<=n;++i){            scanf("%lf",&p[i]);        }        printf("%f\n",dp(n));    }    return 0;}