#include <bits/stdc++.h>
using namespace std;
struct edge {
  edge() {}
  edge(int to, int x) : to(to), x(x) {}
  int to, x;
};
const int inf = 1001001001;
int n;
string s;
vector<edge> G[201010];
int t[1 << 26];
int dfs(int v = 0, int x = 0) {
  if (v == n) return 0;
  int ret = inf;
  for (edge e : G[v]) {
    ret = min(ret, dfs(e.to, e.x) + (x != e.x));
  }
  return ret;
}
int main() {
  cin >> s;
  n = s.size();
  memset(t, -1, sizeof(t));
  int x = 0;
  t[x] = 0;
  for (int i = 0; i < n; ++i) {
    x ^= (1 << (s[i] - 'a'));
    if (~t[x]) {
      G[t[x]].push_back(edge(i + 1, x));
    }
    G[i].push_back(edge(i + 1, x));
    t[x] = i + 1;
    cout << x << " : " << i + 1 << endl;
    if (i == 2) cout << x << endl;
    for (int j = 0; j < 26; ++j) {
      if (i == 2 && j == 1)
        cout << (x ^ (1 << j)) << " " << t[x ^ (1 << j)] << endl;
      if (~t[x ^ (1 << j)]) {
        G[t[x ^ (1 << j)]].push_back(edge(i + 1, x));
      }
    }
  }
  cout << max(dfs(), 1) << endl;
}
