#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
using ll = long long;
template <class T>
bool set_min(T &a, const T &b) {
  return a > b ? a = b, true : false;
}
template <class T>
bool set_max(T &a, const T &b) {
  return a < b ? a = b, true : false;
}
template <class T>
istream &operator>>(istream &is, vector<T> &v) {
  for (T &a : v) is >> a;
  return is;
}
template <class T>
ostream &operator<<(ostream &os, const vector<T> &v) {
  for (const T &t : v) os << "\t" << t;
  return os << endl;
}
template <class T, class U>
ostream &operator<<(ostream &os, const pair<T, U> &v) {
  return os << "<" << v.first << ", " << v.second << ">";
}
const int INF = 1 << 30;
const ll INFL = 1LL << 60;
void dump(int x) {
  if (!x) cerr << 0 << endl;
  while (x) {
    cerr << (x & 1 ? 1 : 0);
    x = x >> 1;
  }
  cerr << endl;
}
class Solver {
 public:
  bool solve() {
    string S;
    cin >> S;
    int N = S.size();
    map<int, int> dp;
    dp[0] = 0;
    for (int i = 0; i < (int)('z' - 'a'); i++) dp[1 << i] = 1;
    int hash = 0;
    for (int i = 0; i < (int)(N); i++) {
      int prev_cnt = dp[hash];
      hash ^= 1 << (S[i] - 'a');
      if (not dp.count(hash)) dp[hash] = prev_cnt + 1;
      for (int j = 0; j < (int)('z' - 'a' + 1); j++) {
        int cnt = __builtin_popcount(hash ^ (1 << j));
        if (cnt == 0 or cnt == 1) {
          int need = hash ^ (1 << j);
          if (dp.count(need)) {
            dp[hash] = min(dp[hash], dp[need] + 1);
          } else {
            dp[hash] = min(dp[hash], prev_cnt + 1);
          }
        }
      }
    }
    cout << max(1, dp[hash]) << endl;
    return 0;
  }
};
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  Solver s;
  s.solve();
  return 0;
}
