比较简单的一个期望递推,设当前连续o的期望为tmp,
则如果当前为x,tmp=0,对答案没有贡献。
如果当前为o,tmp++,对答案有tmp^2-(tmp-1)^2的贡献
如果当前为?,先对答案有((tmp+1)^2-tmp^2)的贡献,tmp=(tmp+1)/2。
按照这个规则,O(n)扫一遍就可以了。
#include<bits/stdc++.h>
using namespace std;
int n;
char s[300005];
double ans,tmp;
int main()
{
freopen("in.txt","r",stdin);
scanf("%d\n%s",&n,s);
for(int i=0;i<n;i++)
if(s[i]=='x')tmp=0.0;
else if(s[i]=='o')ans+=(++tmp)*2.0-1.0;
else ans+=(tmp*2+1)/2.0,tmp=(tmp+1)/2;
printf("%.4f",ans);
return 0;
}