#include <bits/stdc++.h>
typedef struct {
  int a;
  int b;
} hw;
typedef struct {
  signed long long a;
  signed long long b;
} hwll;
const hw vector8[8] = {{-1, -1}, {-1, 0},  {-1, +1}, {0, -1},
                       {0, +1},  {+1, -1}, {+1, 0},  {+1, +1}};
unsigned long long n, m;
unsigned long long h, w;
unsigned long long k;
unsigned long long va, vb, vc, vd, ve, vf;
char s[200000 + 1];
void swap_adj(unsigned long long *a, unsigned long long *b) {
  unsigned long long tmp = *b;
  *b = *a;
  *a = tmp;
  return;
}
unsigned long long divide(unsigned long long a, unsigned long long b) {
  unsigned long long x = 1000000007 - 2;
  unsigned long long ans = 1;
  while (x) {
    if (x & 1) ans = (ans * b) % 1000000007;
    b = (b * b) % 1000000007;
    x /= 2;
  }
  return (a * ans) % 1000000007;
}
int digits(unsigned long long x) {
  int i = 1;
  while (x >= 10) {
    x /= 10;
    i++;
  }
  return i;
}
int min(unsigned long long x, unsigned long long y) { return (x < y) ? x : y; }
unsigned long long gcd(unsigned long long x, unsigned long long y) {
  if (x < y) {
    return gcd(y, x);
  } else if (y == 0) {
    return x;
  } else {
    return gcd(y, x % y);
  }
}
unsigned long long bitpow(unsigned long long a, unsigned long long x) {
  unsigned long long result = 1;
  while (x) {
    if (x & 1) {
      result *= a;
      result %= 1000000007;
    }
    x /= 2;
    a = (a * a) % 1000000007;
  }
  return result;
}
int nibutan_target(unsigned long long target) {
  unsigned long long maxdist = (target * (target + 1) / 2);
  return (n <= maxdist);
}
int targetdig(unsigned long long x, int index) {
  int posmax = digits(x);
  if (posmax < index) return -1;
  while (posmax > index) {
    posmax--;
    x /= 10;
  }
  return x % 10;
}
int intcomp(const void *left, const void *right) {
  if ((*(int *)left) < (*(int *)right)) {
    return -1;
  } else if ((*(int *)left) > (*(int *)right)) {
    return +1;
  } else {
    return 0;
  }
}
int ullcomp(const void *left, const void *right) {
  if ((*(unsigned long long *)left) < (*(unsigned long long *)right)) {
    return -1;
  } else if ((*(unsigned long long *)left) > (*(unsigned long long *)right)) {
    return +1;
  } else {
    return 0;
  }
}
int sllcomp(const void *left, const void *right) {
  if ((*(signed long long *)left) < (*(signed long long *)right)) {
    return -1;
  } else if ((*(signed long long *)left) > (*(signed long long *)right)) {
    return +1;
  } else {
    return 0;
  }
}
int hwAcomp(const void *left, const void *right) {
  return intcomp(&(((hw *)left)->a), &(((hw *)right)->a));
}
int hwBcomp(const void *left, const void *right) {
  return intcomp(&(((hw *)left)->b), &(((hw *)right)->b));
}
int hwABcomp(const void *left, const void *right) {
  int x = hwAcomp(left, right);
  if (x) return x;
  return hwBcomp(left, right);
}
int hwllAcomp(const void *left, const void *right) {
  return sllcomp(&(((hw *)left)->a), &(((hw *)right)->a));
}
int hwllBcomp(const void *left, const void *right) {
  return sllcomp(&(((hw *)left)->b), &(((hw *)right)->b));
}
int hwllABcomp(const void *left, const void *right) {
  int x = hwllAcomp(left, right);
  if (x) return x;
  return hwllBcomp(left, right);
}
int ispalin(int x) { return (x == 0) || ((x & -x) == x); }
int bitlet(char c) { return (1 << (c - 'a')); }
unsigned long long solve() {
  int i, j, ki;
  int len = strlen(s);
  int first = 0;
  int last = len - 1;
  int result = 0;
  int palin = 0;
  for (i = 0; i < len; i++) palin ^= bitlet(s[i]);
  while (first <= last) {
    int maylen = 0;
    int fpartlin = 0;
    int lpartlin = 0;
    for (;;) {
      if (ispalin(palin ^ fpartlin)) {
        last = first + maylen - 1;
        result++;
        palin = fpartlin;
        break;
      }
      if (ispalin(palin ^ lpartlin)) {
        first = last - maylen + 1;
        result++;
        palin = lpartlin;
        break;
      }
      fpartlin ^= bitlet(s[first + maylen]);
      lpartlin ^= bitlet(s[last - maylen]);
      maylen++;
    }
  }
  printf("%d\n", result);
  return 0;
}
int main(void) {
  int i, j;
  scanf("%s", s);
  solve();
  return 0;
}
