题意:
解法:
将 题 目 给 的 字 符 串 看 作 是 01 序 列 , 成 功 为 1 失 败 为 0. 设 x 当 前 操 作 进 行 连 续 1 的 个 数 . ( x + 1 ) 2 − x 2 = x 2 + 2 x + 1 − x 2 = 2 x + 1 即 每 新 增 一 个 1 , 那 么 分 数 会 增 加 2 x + 1. 令 c n t [ i ] 表 示 前 i 个 字 符 , x 的 期 望 值 , 那 么 c n t [ i ] = ( c n t [ i − 1 ] + 1 ) ∗ p , 其 中 p 为 第 i 个 字 符 为 1 的 概 率 . 令 d [ i ] 表 前 i 个 字 符 , 得 分 的 期 望 值 , 那 么 d [ i ] = d [ i − 1 ] + ( 2 ∗ c n t [ i − 1 ] + 1 ) ∗ p , 其 中 p 为 第 i 个 字 符 为 1 的 概 率 . 递 推 出 d [ n ] 即 可 . 将题目给的字符串看作是01序列,成功为1失败为0.\\ 设x当前操作进行连续1的个数.\\ (x+1)^2-x^2\\ =x^2+2x+1-x^2\\ =2x+1\\ 即每新增一个1,那么分数会增加2x+1.\\ 令cnt[i]表示前i个字符,x的期望值,\\ 那么cnt[i]=(cnt[i-1]+1)*p,其中p为第i个字符为1的概率.\\ 令d[i]表前i个字符,得分的期望值,\\ 那么d[i]=d[i-1]+(2*cnt[i-1]+1)*p,其中p为第i个字符为1的概率.\\ 递推出d[n]即可. 将题目给的字符串看作是01序列,成功为1失败为0.设x当前操作进行连续1的个数.(x+1)2−x2=x2+2x+1−x2=2x+1即每新增一个1,那么分数会增加2x+1.令cnt[i]表示前i个字符,x的期望值,那么cnt[i]=(cnt[i−1]+1)∗p,其中p为第i个字符为1的概率.令d[i]表前i个字符,得分的期望值,那么d[i]=d[i−1]+(2∗cnt[i−1]+1)∗p,其中p为第i个字符为1的概率.递推出d[n]即可.
code:
#include <bits/stdc++.h>
using namespace std;
const int maxm=3e5+5;
char s[maxm];
double cnt[maxm];
double d[maxm];
int n;
signed main(){
cin>>n;
cin>>(s+1);
for(int i=1;i<=n;i++){
double p=1;
if(s[i]=='o')p=1;
else if(s[i]=='x')p=0;
else if(s[i]=='?')p=0.5;
cnt[i]=(cnt[i-1]+1)*p;
d[i]=d[i-1]+(2*cnt[i-1]+1)*p;
}
printf("%.4f\n",d[n]);
return 0;
}