设 \(len\) 表示当前的期望连击数,设 \(ans\) 为当前的答案,我们分类讨论来更新 \(ans\):
- 当现在打到了这个音符,那么 \(ans \to ans+(len+1)^2-len^2 = ans+len\times 2+1\)。
- 当现在没打到这个音符,那么 \(ans\) 不变。
- 当现在不知道打没打到,那么 \(ans \to ans+\frac{(len\times 2 + 1 )+ 0}{2} = len+0.5\)。
对于 \(len\) 我们依旧分类讨论:
- 当现在打到了这个音符,那么 \(len \to len+1\)。
- 当现在没打到这个音符,那么 \(len \to 0\)。
- 当不知道打没打到,根据期望的定义,\(len \to \frac{(len+1)+0}{2}=\frac{len+1}{2}\)。
点击查看代码
#include<bits/stdc++.h>
#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define inn(i,n,a) For(i,1,n) a[i]=read();
#define ll long long
#define i128 __int128
using namespace std;
inline int read() {
int xx= 0;int f= 1;
char c = getchar();
while(c<'0'||c>'9') {
if(c=='-') f= -1;
c= getchar();
}
while(c>='0'&&c<='9') {
xx= (xx<<1)+(xx<<3)+(c^48);
c= getchar();
}
return xx*f;
}
#define maxn 200050
double len,ans;
int n;
char ch;
signed main() {
in1(n);
For(i,1,n) {
char ch=getchar();
while(ch!='x'&&ch!='?'&&ch!='o') ch=getchar();
if(ch=='x') len=0;
else if(ch=='o') ans+=len+len+1,len++;
else ans+=len+0.5,len=(len+1)/2;
}
printf("%.4lf",ans);
}