貌似就是道简单的DP题。。。恩!
令f[i]表示到第i位的期望分数,l[i]表示到第i位的期望连续'o'的长度
对于长度为l的连续'o',长度又增加1,则贡献增加(l + 1)2 - l2 = 2 * l + 1
如果第i位是'o',则
l[i] = l[i - 1] + 1, f[i] = f[i - 1] + (2 * l[i - 1] + 1) (后面的一个等式可以推广到'?'的情况)
如果第i位是'x',则
l[i] = 0, f[i] = f[i - 1]
如果第i位是'?',则有一半概率是'x',一半概率是'o'讨论一下即可
l[i] = (l[i - 1] + 1) / 2, f[i] = f[i - 1] + (2 * l[i - 1] + 1) / 2 = f[i - 1] + (l[i - 1] + 0.5)
于是就做完辣~

1 /************************************************************** 2 Problem: 3450 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:12 ms 7 Memory:1100 kb 8 ****************************************************************/ 9 10 #include <cstdio> 11 12 using namespace std; 13 typedef double lf; 14 const int Maxlen = 3e5 + 100; 15 16 int n; 17 lf f[2], l[2]; 18 19 char buf[Maxlen], *ch = buf; 20 int Len; 21 22 inline int read() { 23 int x = 0; 24 while (*ch < '0' || '9' < *ch) ++ch; 25 while ('0' <= *ch && *ch <= '9') 26 x = x * 10 + *ch - '0', ++ch; 27 return x; 28 } 29 30 int main() { 31 Len = fread(ch, 1, Maxlen, stdin); 32 buf[Len] = '