题面
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 }