長度 n 的序列,字符為 'o'、'x'、'?'。連續 k 個 'o' 得分 k²。'?' 等概率為 'o' 或 'x'。求期望總得分。
L[i]:第 i 位結尾連續 'o' 的期望長度F[i]:前 i 位的期望總得分if s[i] == 'o': L[i] = L[i-1] + 1, F[i] = F[i-1] + 2*L[i] - 1 if s[i] == 'x': L[i] = 0, F[i] = F[i-1] if s[i] == '?': L[i] = (L[i-1] + 1) / 2, F[i] = F[i-1] + L[i-1] + 0.5
k² - (k-1)² = 2k-12(L+1)-1),1/2 概率歸零(增量 0),期望增量 (2L+1)/2 = L+0.5#include <cstdio>
using namespace std;
double L[300005], F[300005];
char s[300005];
int main() {
int n; scanf("%d%s", &n, s+1);
for (int i = 1; i <= n; ++i) {
if (s[i] == 'o') {
L[i] = L[i-1] + 1;
F[i] = F[i-1] + 2*L[i] - 1;
} else if (s[i] == 'x') {
L[i] = 0;
F[i] = F[i-1];
} else { // '?'
L[i] = (L[i-1] + 1) / 2.0;
F[i] = F[i-1] + L[i-1] + 0.5;
}
}
printf("%.4lf\n", F[n]);
return 0;
}