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
10 − 6
.
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;
}