#include <bits/stdc++.h>
using std::abs;
using std::array;
using std::cerr;
using std::cin;
using std::cout;
using std::generate;
using std::make_pair;
using std::map;
using std::max;
using std::max_element;
using std::min;
using std::min_element;
using std::pair;
using std::reverse;
using std::set;
using std::sort;
using std::string;
using std::unique;
using std::vector;
template <typename T>
T input() {
  T res;
  cin >> res;
  {};
  return res;
}
template <typename IT>
void input_seq(IT b, IT e) {
  std::generate(b, e,
                input<typename std::remove_reference<decltype(*b)>::type>);
}
int solve(const string& s) {
  std::map<uint32_t, int> fst;
  vector<uint32_t> f(int((s).size()) + 1);
  f[0] = 0;
  fst[0] = 0;
  for (int i = 0; i != int((s).size()); ++i) {
    f[i + 1] = f[i];
    f[i + 1] ^= (1 << (s[i] - 'a'));
    if (not fst.count(f[i + 1])) fst[f[i + 1]] = i + 1;
  }
  if (f.back() == 0) return 1;
  int ans = 0;
  int pos = int((s).size());
  while (pos != 0) {
    auto cur = f[pos];
    int mingo = std::numeric_limits<int>::max();
    for (int let = 0; let != 26; ++let) {
      auto go = cur ^ (1 << let);
      if (fst.count(go)) mingo = min(mingo, fst[go]);
    }
    pos = mingo, ans += 1;
  }
  return ans;
}
int main() {
  std::iostream::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  string s = input<string>();
  cout << solve(s) << "\n";
  return 0;
}
