Solution:
期望题总是贼有意思。
本题期望combo为o的期望连续长度的平方,所以我们设f[i]表示到了第i位的总期望combo,g[i]表示到了第i位结尾的连续o的期望长度,那么分情况讨论:
1、当s[i]==x,则f[i]=f[i-1],g[i]=0;
2、当s[i]==o,则f[i]=f[i-1]+2*g[i-1]+1,g[i]=g[i-1]+1(f[i]=f[i-1]+2*g[i-1]+1是因为f[i]=(g[i-1]+1)^2=g[i-1]^2+2*g[i-1]+1\;,\;g[i-1]^2=f[i-1]);
3、当s[i]==?,则f[i]=f[i-1]+g[i-1]+0.5,g[i]=\frac{g[i-1]+1}{2};
注意:由于不知道n的范围,不好开数组,但是我们发现转移时当前的状态只与上一次的状态有关,于是直接滚掉就好了。
### 代码:
```cpp
/*Code by 520 -- 7.29*/
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
using namespace std;
int n,cnt;
char s;
double f[2],g[2];
int main(){
ios::sync_with_stdio(0);
cin>>n;
For(i,1,n){
cin>>s;
if(s=='x') f[cnt^1]=f[cnt],g[cnt^1]=0;
else if(s=='o') f[cnt^1]=f[cnt]+2*g[cnt]+1,g[cnt^1]=g[cnt]+1;
else f[cnt^1]=f[cnt]+g[cnt]+0.5,g[cnt^1]=g[cnt]/2+0.5;
cnt^=1;
}
printf("%.4lf",f[cnt]);
return 0;
}
```