Code:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n;
string s;
double p[30];
double solve(int l,int r)
{
//cout<<l<<" "<<r<<endl;
if(l==r)return p[int(s[l]-'A'+1)];
if(l>r)return 0;
int cnt=0;
double x=1;
bool flag=1;
//flag=0 表示串联,flag=1 表示并联
for(int i=l;i<=r;i++)
{
if(s[i]=='(')cnt++;
if(s[i]==')')cnt--;
if(cnt==0&&s[i]==',')flag=0;
}
//cout<<flag<<endl;
if(flag==0)
{
int last=l;
cnt=0;
for(int i=l;i<r;i++)
{
if(s[i]=='(')cnt++;
if(s[i]==')')cnt--;
if(s[i]==','&&cnt==0)
{
x*=(1-solve(last,i-1));
last=i+1;
}
//cout<<i<<","<<last<<endl;
}
x*=(1-solve(last,r));
return 1-x;
}
else
{
int last=l+1;
cnt=0;
for(int i=l;i<r;i++)
{
if(s[i]=='(')cnt++;
if(s[i]==')')cnt--;
if(s[i]==')'&&s[i+1]=='('&&cnt==0)
{
x*=solve(last,i-1);
last=i+2;
}
//cout<<i<<","<<last<<endl;
}
x*=solve(last,r-1);
return x;
}
}
int main()
{
cin>>n>>s;
for(int i=1;i<=n;i++)cin>>p[i];
printf("%.4lf\n",solve(0,s.size()-1));
return 0;
}