ans=sigma(每个子串中元音数/子串长度)
先求出前缀和 P
S为总长度
Len表示长度为Len的子串集合。
Len=1:Sum[1] =P[ S ] - P[ 0 ]
Len=2:Sum[2] =P[ S-1 ] - P[ 1 ] + Sum[1];
Len=3:Sum[3] =P[ S-Len+1 ] - P[ Len-1 ] +Sum[ 2 ]
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <cmath>
using namespace std;
#include <queue>
#include <stack>
#include <set>
#include <vector>
#include <deque>
#include <map>
#define cler(arr, val) memset(arr, val, sizeof(arr))
typedef long long LL;
const int MAXN = 1000100;
const int MAXM = 140000;
const int INF = 0x7fffffff;
const int mod = 1000000007;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
bool yes(char ch)
{
return ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' ||
ch == 'U' || ch == 'Y';
}
char s[500010];
int a[500010];
int main()
{
cin>>s+1;
int len=strlen(s+1);
a[0]=0;
for(int i=1;s[i];i++)
{
a[i]=a[i-1]+yes(s[i]);
}
double ans=0,res=0;
for(int i=1;i<=len;i++)
{
ans+=a[len-i+1]-a[i-1];
res+=ans/i;
}
printf("%.10lf\n",res);
return 0;
}
Len=1:Sum+=P[ S-Len+1 ] - P[ Len-1 ]
Len=1:Sum+=P[ S-Len+1 ] - P[ Len-1 ]