#include <bits/stdc++.h>
using namespace std;
template <class T>
using V = vector<T>;
template <class T>
using VV = V<V<T>>;
template <class T, class Y>
ostream& operator<<(ostream& o, const pair<T, Y>& p) {
  return o << "(" << p.first << ", " << p.second << ")";
}
template <typename A, size_t N, typename T>
void Fill(A (&array)[N], const T& v) {
  fill((T*)array, (T*)(array + N), v);
}
__int128_t gcd(__int128_t a, __int128_t b, __int128_t& x, __int128_t& y) {
  if (!b) {
    x = 1;
    y = 0;
    return a;
  }
  __int128_t d = gcd(b, a % b, y, x);
  y -= a / b * x;
  return d;
}
long long gcd(long long a, long long b) {
  __int128_t x = 0, y = 0;
  return gcd(a, b, x, y);
}
long long modInv(long long a, long long m) {
  __int128_t x, y;
  gcd(a, m, x, y);
  return (x % m + m) % m;
}
long long modPow(__int128_t a, __int128_t n, long long m) {
  if (!a) return a;
  __int128_t p = 1;
  for (; n > 0; n >>= 1, a = a * a % m)
    if (n & 1) p = p * a % m;
  return (long long)p;
}
bool isPrime(long long n) {
  if (n < 2 || n % 2 == 0) return n == 2;
  __int128_t t = n - 1, d = t / (t & -t);
  for (__int128_t a : {2, 325, 9375, 28178, 450775, 9780504, 1795265022})
    if (a % n) {
      for (t = d, a = modPow(a, t, n); t != n - 1 && a != 1 && a != n - 1;
           a = a * a % n, t = t * 2 % n)
        ;
      if (a != n - 1 && t % 2 == 0) return 0;
    }
  return 1;
}
const int IINF = 1e9 + 6;
const long long LINF = 1e18;
const int MOD = 1e9 + 7;
const double PI = acos(-1);
const double EPS = 1e-10;
static random_device rd;
static mt19937 rnd(rd());
const int N = 2e5 + 1;
string s;
int x[N], DP[N];
map<int, int> m;
int _calc(int);
int calc(int);
int _calc(int n) {
  DP[n] = IINF;
  int y = x[n];
  for (int j = (0), jformax = (27); j < jformax; j++) {
    int _y = (j == 26 ? y : y ^ (1 << j));
    if (m.find(_y) != m.end()) DP[n] = min(DP[n], calc(m[_y]) + 1);
  }
  return DP[n];
}
int calc(int n) {
  if (!n || DP[n]) return DP[n];
  return _calc(n);
}
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin >> s;
  m[0] = 0;
  for (int i = (0), iformax = ((int)(s).size()); i < iformax; i++) {
    x[i + 1] = x[i] ^ (1 << (s[i] - 'a'));
    if (m.find(x[i + 1]) == m.end()) m[x[i + 1]] = i + 1;
  }
  calc((int)(s).size());
  cout << DP[(int)(s).size()] << endl;
}
