#include <bits/stdc++.h>
using namespace std;
template <class T>
bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T>
bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T>
T div_floor(T a, T b) {
  if (b < 0) a *= -1, b *= -1;
  return a >= 0 ? a / b : (a + 1) / b - 1;
}
template <class T>
T div_ceil(T a, T b) {
  if (b < 0) a *= -1, b *= -1;
  return a > 0 ? (a - 1) / b + 1 : a / b;
}
constexpr long long mod = 1e9 + 7;
constexpr long long INF = mod * mod;
constexpr int MAX = 200010;
int main() {
  string s;
  cin >> s;
  int n = s.size();
  int X[n + 1];
  X[0] = 0;
  for (int((i)) = (int)(0); ((i)) < (int)((n)); ++((i)))
    X[i + 1] = X[i] ^ (1 << (s[i] - 'a'));
  int dp[n + 1];
  fill(dp, dp + n + 1, MAX);
  dp[0] = 0;
  map<int, int> mp;
  mp[0] = 0;
  for (int(i) = (int)(1); (i) < (int)(n + 1); ++(i)) {
    if (mp.find(X[i]) != mp.end()) dp[i] = mp[X[i]] + 1;
    for (int((j)) = (int)(0); ((j)) < (int)((26)); ++((j)))
      if (X[i] >> j & 1) {
        int t = X[i] ^ 1 << j;
        if (mp.find(t) != mp.end()) chmin(dp[i], mp[t] + 1);
      }
    if (mp.find(X[i]) == mp.end())
      mp[X[i]] = dp[i];
    else
      chmin(mp[X[i]], dp[i]);
  }
  printf("%d\n", dp[n]);
}
