設 \(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);
}