#include <bits/stdc++.h>
using namespace std;
struct P {
  int x, y, z;
  bool operator<(const P &a) const { return x > a.x; }
};
struct S {
  int x, y;
};
int v[1 << 26];
int a, b, c, n, m, i, o[200055], k, d, e, dy[15] = {0, 0, -1, 1, -1, 1, -1, 1},
                                          dx[15] = {-1, 1, 0, 0, 1, 1, -1, -1};
int l[201115];
S u[1010][1600][5];
queue<int> q;
long long x, y = 0, z[99];
set<int> s;
string r, r1;
bool as(int a, int b) { return a > b; }
int f(int t) {
  if (t == 0) return 0;
  printf("%d\n", t);
  return f(t - 1) + 1;
}
int main() {
  cin >> r;
  for (int t = 0; t < r.size(); t++) {
    l[t] = 987654321;
    i ^= (1 << (r[t] - 'a'));
    o[t + 1] = i;
    v[i] = t + 1;
    if (i == 0) b = max(b, t + 1);
  }
  if (b == r.size()) {
    puts("1");
    return 0;
  }
  l[r.size()] = 987654321;
  i = 0;
  l[b] = 0;
  q.push(0);
  q.push(b);
  for (; q.size(); q.pop()) {
    int i = o[q.front()];
    for (int t = 'a'; t <= 'z'; t++) {
      int u = i ^ (1 << (t - 'a'));
      if (l[v[u]] > l[q.front()] + 1) {
        l[v[u]] = l[q.front()] + 1;
        q.push(v[u]);
      }
    }
  }
  printf("%d", l[r.size()]);
  return 0;
}
