2020 camp dy-2-A

题面

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

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

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

 

输入格式:

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

输出格式

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

输入样例:

legilimens
 

输出样例:

0.446746032

题解

 

 

#include <cstdio>
#include <algorithm>

#define RE register
#define FOR(i,a,b) for(RE int i = a;i <= b;++i)
#define ROF(i,a,b) for(RE int i = a;i >= b;--i)
#define sc(n) scanf("%d", &n)
#define ll long long

using namespace std;

const int maxn = 1e6 + 10;

char s[maxn];
char p[] = "aeiouy";
ll sum[maxn], f[maxn];
int len;

void sumtot()
{
    int& i = len;
    for (i = 1; s[i]; ++i)
    {
        int flag = 0;
        for (RE int j = 0; p[j]; ++j)
            if (p[j] == s[i])
            {
                flag = 1;
                break;
            }
        sum[i] = sum[i - 1] + flag;
    }
    --i;
}

int main()
{
    scanf("%s", s + 1);
    sumtot();
    FOR(i, 1, len)
        f[i] = f[i - 1] + sum[len - i + 1] - sum[i - 1];
    long double ans = 0;
    FOR(i, 1, len)ans += (1.0 * f[i] / i);
    ans *= 2;
    ans /= 1ll * len * (len + 1);
    printf("%.10llf", ans);
    return 0;
}

  

 

 
posted @ 2020-01-15 14:31  洛绫璃  阅读(297)  评论(0编辑  收藏  举报