#include <bits/stdc++.h>
using namespace std;
struct node {
  int l, r;
  long long f1, f2;
};
char s[500033];
node tr[2000003];
int l0, r0, x, type, p;
void build(int k, int l, int r) {
  tr[k].f1 = tr[k].f2 = 0;
  tr[k].l = l;
  tr[k].r = r;
  if (l == r) return;
  int mid = (l + r) / 2;
  build(2 * k, l, mid);
  build(2 * k + 1, mid + 1, r);
}
void up(int k) {
  if (l0 <= tr[k].l && tr[k].r <= r0) {
    if (type == 1) tr[k].f1++;
    if (type == 2) tr[k].f2 += x;
    if (type == 3) tr[k].f1--;
    return;
  }
  int mid = (tr[k].l + tr[k].r) / 2;
  if (l0 <= mid) up(2 * k);
  if (r0 > mid) up(2 * k + 1);
}
long long query(int k) {
  if (tr[k].l == tr[k].r && tr[k].l == p) {
    long long pp = p;
    return tr[k].f1 * pp + tr[k].f2;
  }
  int mid = (tr[k].l + tr[k].r) / 2;
  if (tr[k].f1 != 0) {
    tr[2 * k].f1 += tr[k].f1;
    tr[2 * k + 1].f1 += tr[k].f1;
    tr[k].f1 = 0;
  }
  if (tr[k].f2 != 0) {
    tr[2 * k].f2 += tr[k].f2;
    tr[2 * k + 1].f2 += tr[k].f2;
    tr[k].f2 = 0;
  }
  if (p <= mid) return query(2 * k);
  if (p > mid) return query(2 * k + 1);
}
int main() {
  scanf("%s", s);
  int len = strlen(s);
  build(1, 1, len);
  for (int i = 0; i < len; i++) {
    if (s[i] == 'I' || s[i] == 'E' || s[i] == 'A' || s[i] == 'O' ||
        s[i] == 'U' || s[i] == 'Y') {
      int l = i, r = len - l - 1;
      int mn = min(l, r);
      int mx = max(l, r);
      l0 = 1, r0 = mn, x = 0, type = 1;
      if (mn > 0) up(1);
      l0 = mn + 1, r0 = mx, x = mn + 1, type = 2;
      up(1);
      l0 = mx + 1, r0 = len, x = len + 1, type = 2;
      up(1);
      l0 = mx + 1, r0 = len, x = 0, type = 3;
      up(1);
    }
  }
  double ans = 0.0;
  for (int i = 1; i <= len; i++) {
    p = i;
    ans += query(1) / 1.0 / i;
  }
  printf("%.7f", ans);
  return 0;
}
