codeForces 509E 想法题

Pretty Song

time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
When Sasha was studying in the seventh grade, he started listening to music a lot. In order to evaluate which songs he likes more, he introduced the notion of the song’s prettiness. The title of the song is a word consisting of uppercase Latin letters. The prettiness of the song is the prettiness of its title.

Let’s define the simple prettiness of a word as the ratio of the number of vowels in the word to the number of all letters in the word.

Let’s define the prettiness of a word as the sum of simple prettiness of all the substrings of the word.

More formally, let’s define the function vowel(c) which is equal to 1, if c is a vowel, and to 0 otherwise. Let si be the i-th character of string s, and si..j be the substring of word s, staring at the i-th character and ending at the j-th character (sisi + 1… sj, i ≤ j).

Then the simple prettiness of s is defined by the formula:

The prettiness of s equals

Find the prettiness of the given song title.

We assume that the vowels are I, E, A, O, U, Y.

Input
The input contains a single string s (1 ≤ |s| ≤ 5· 105 ) — the title of the song.

Output
Print the prettiness of the song with the absolute or relative error of at most 106 .

Examples

input
IEAIAIO

output
28.0000000

input
BYOB

output
5.8333333

input
YISVOWEL

output
17.0500000

Note
In the first sample all letters are vowels. The simple prettiness of each substring is 1. The word of length 7 has 28 substrings. So, the prettiness of the song equals to 28.

题目链接

题意:给你一个字符串,定义元音字母为I, E, A, O, U, Y,求这个字符串中所有子串中元音占的比例的总和。

解题思路:我们可以发现长度为2的子串中第一个和最后一个字母出现的次数为1,其他为2,同理发现长度为3的子串中第一个和最后一个字母出现的次数为1,第二个和最后第二个字母出现的次数为2,其他为3,所以若长度为i-1的字符串中元音字母出现的个数为q[i-1],则我们可以得到q[i]=q[i-1]+p[l-i+1]-p[i-1],其中p数组为前n项元音字母的个数。最后ans=q[1]/1+q[2]/2…….q[len]/len(len为字符串的总长)

#include<cstdio>
#include<cstring>
#define maxn 500005
typedef long long ll; 
char st[maxn];
ll p[maxn],q[maxn];
double ans;
int main(){
    scanf("%s",st+1);
    ll l=strlen(st+1);
    for(ll i=1;i<=l;i++){
        if(st[i]=='I'||st[i]=='E'||st[i]=='A'||st[i]=='O'||st[i]=='U'||st[i]=='Y')  p[i]=p[i-1]+1;
        else p[i]=p[i-1];
    }
    q[0]=0;
    for(ll i=1;i<=l;i++){
        q[i]=q[i-1]+p[l-i+1]-p[i-1];
        ans+=q[i]/(double)i;
    }
    printf("%.7lf\n",ans);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值