B. Dreamoon and WiFi
题意:初始值为0,根据一个串来改变值的大小:遇到'+'则+1,遇到'-'则-1。这个串经过传送后,会变成'+','-'或'?',如果遇到'?',则等概率+1或-1。问最终结果和原串相同的概率。
思路:暴力。因为数据量小,枚举每一种情况即可。最后计算与原串值一样的种数数除以总种数。
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <memory.h>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <ctype.h>
#include <sstream>
#define INF 1000000000
#define ll long long
#define min3(a,b,c) min(a,min(b,c))
#define max3(a,b,c) max(a,max(b,c))
#define MAXN 100010
using namespace std;
string str1;
string str2;
queue<int> q1;
queue<int> q2;
int main(){
while(cin>>str1>>str2){
int siz=str1.size();
int ans=0;
for(int i=0;i<siz;i++){
if(str1[i]=='+')ans++;
else ans--;
}
q2.push(0);
for(int i=0;i<siz;i++){
if(i&1){
while(!q1.empty()){
int cur=q1.front(); q1.pop();
if(str2[i]=='+'){
q2.push(cur+1);
}else if(str2[i]=='-'){
q2.push(cur-1);
}else{
q2.push(cur+1);
q2.push(cur-1);
}
}
}else{
while(!q2.empty()){
int cur=q2.front(); q2.pop();
if(str2[i]=='+'){
q1.push(cur+1);
}else if(str2[i]=='-'){
q1.push(cur-1);
}else{
q1.push(cur+1);
q1.push(cur-1);
}
}
}
}
double re=0.0;
int cnt1=0;
int cnt2=0;
//cout<<ans<<endl;
if(siz&1){
while(!q1.empty()){
int cur=q1.front(); q1.pop();
cnt1++;
if(cur==ans)cnt2++;
}
}else{
while(!q2.empty()){
int cur=q2.front(); q2.pop();
cnt1++;
if(cur==ans)cnt2++;
}
}
printf("%.10lf\n",(cnt2+0.0)/cnt1);
}
return 0;
}