维护一个最长连续’o’序列的期望就好了。。
#include<iostream>
#include<cstdio>
using namespace std;
int n;
char s[300005];
double p1[300005],p2[300005];
double ans;
int main()
{
scanf("%d",&n);
scanf("%s",s+1);
for (int i=1;i<=n;i++)
{
double p;
switch (s[i])
{
case 'o':p=1.0; break;
case 'x':p=0.0; break;
case '?':p=0.5; break;
}
p1[i]=(p1[i-1]+1)*p;
p2[i]=(p2[i-1]+2*p1[i-1]+1)*p;
ans+=p2[i-1]*(1-p);
}
ans+=p2[n];
printf("%.4lf",ans);
return 0;
}