2020 camp dy-2-A

题面

7-1 2A. 托米的字符串
 

托米有一个字符串,他经常拿出来玩。这天在英语课上,他学习了元音字母,以及半元音y。“这些字母是非常重要的!”,托米这样想着,“那么我如果随机取一个子串,里面元音占比期望会有多大呢?”

于是,请你求出对于托米的字符串,随机取一个子串,元音(,)字母占子串长度比的期望是多少。

输入格式:

读入一个长度不超过1的只包含小写字母的字符串,即托米的字符串。

输出格式

输出所求的期望值,要求相对(绝对)误差不超过1。

输入样例:

legilimens
 

输出样例:

0.446746032

题解

 1 #include <cstdio>
 2 #include <algorithm>
 3 
 4 #define RE register
 5 #define FOR(i,a,b) for(RE int i = a;i <= b;++i)
 6 #define ROF(i,a,b) for(RE int i = a;i >= b;--i)
 7 #define sc(n) scanf("%d", &n)
 8 #define ll long long
 9 
10 using namespace std;
11 
12 const int maxn = 1e6 + 10;
13 
14 char s[maxn];
15 char p[] = "aeiouy";
16 ll sum[maxn], f[maxn];
17 int len;
18 
19 void sumtot()
20 {
21     int& i = len;
22     for (i = 1; s[i]; ++i)
23     {
24         int flag = 0;
25         for (RE int j = 0; p[j]; ++j)
26             if (p[j] == s[i])
27             {
28                 flag = 1;
29                 break;
30             }
31         sum[i] = sum[i - 1] + flag;
32     }
33     --i;
34 }
35 
36 int main()
37 {
38     scanf("%s", s + 1);
39     sumtot();
40     FOR(i, 1, len)
41         f[i] = f[i - 1] + sum[len - i + 1] - sum[i - 1];
42     long double ans = 0;
43     FOR(i, 1, len)ans += (1.0 * f[i] / i);
44     ans *= 2;
45     ans /= 1ll * len * (len + 1);
46     printf("%.10llf", ans);
47     return 0;
48 }
 

猜你喜欢

转载自www.cnblogs.com/2aptx4869/p/12196547.html