#include <bits/stdc++.h>
const int maxn = 3e5 + 7;
int acable[27];
char s[maxn];
int n, pre[maxn], dp[maxn];
std::unordered_map<int, int> opt;
int main() {
  for (int i = 1; i < 27; ++i) {
    acable[i] = 1 << (i - 1);
  }
  scanf("%s", s);
  n = strlen(s);
  for (int i = 1; i <= n; ++i) {
    pre[i] = pre[i - 1];
    pre[i] ^= 1 << (s[i - 1] - 'a');
    fprintf(stderr, "%d\n", pre[i]);
  }
  dp[0] = 0;
  opt[0] = 0;
  for (int i = 1; i <= n; ++i) {
    dp[i] = 0x7fffffff;
    for (int j = 0; j < 27; ++j) {
      if (opt.find(pre[i] ^ acable[j]) != opt.end()) {
        dp[i] = std::min(dp[i], dp[opt[pre[i] ^ acable[j]]] + 1);
      }
    }
    if (opt.find(pre[i]) == opt.end()) {
      opt[pre[i]] = dp[i];
    } else {
      opt[pre[i]] = std::min(dp[i], opt[pre[i]]);
    }
  }
  printf("%d\n", dp[n]);
  return 0;
}
