http://codeforces.com/problemset/problem/509/E
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.
The input contains a single string s (1 ≤ |s| ≤ 5·105) — the title of the song.
Print the prettiness of the song with the absolute or relative error of at most 10 - 6.
IEAIAIO
28.0000000
BYOB
5.8333333
YISVOWEL
17.0500000
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, theprettiness of the song equals to 28.
/**
CF 509E
题目大意:给定一个字符串,可以看做由0和1组成计算所有子串的 prettiness和,一个子串ai~aj计算方法:(ai+ai+1+...+aj)/(j-i+1);
解题思路:题目给出的字符串的长度是5*10^5,如果枚举每一个子串是不行的,需要时间为O(n*n)我们发现对于长度为x的子串所用的字符
第(x~n-x)的都是x次,第x-1个字符用了x-1次,第x-2个字符用了x-2次……这样一来我们就能做了:
首先求一下前缀和,枚举子串的长度从1到n,每次分别从两端各减少一位,累加即可。
*/
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long LL;
const int maxn=500006;
char a[maxn];
LL sum[maxn];
int main()
{
while(~scanf("%s",a+1))
{
int n=strlen(a+1);
memset(sum,0,sizeof(sum));
for(int i=1;i<=n;i++)
{
int x;
if(a[i]=='A'||a[i]=='E'||a[i]=='I'||a[i]=='O'||a[i]=='U'||a[i]=='Y')
x=1;
else
x=0;
sum[i]=sum[i-1]+x;
}
int l=0,r=n;
LL ans=0;
double cnt=0.0;
for(int i=1;i<=n;i++)
{
ans+=sum[r]-sum[l];
cnt+=(double)ans/(double)i;
l++;
r--;
}
printf("%.10lf\n",cnt);
}
return 0;
}