#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-9;
const int inf = 2000000000;
const long long infLL = 9000000000000000000;
template <typename first, typename second>
ostream& operator<<(ostream& os, const pair<first, second>& p) {
  return os << "(" << p.first << ", " << p.second << ")";
}
template <typename T>
ostream& operator<<(ostream& os, const vector<T>& v) {
  os << "{";
  for (auto it = v.begin(); it != v.end(); ++it) {
    if (it != v.begin()) os << ", ";
    os << *it;
  }
  return os << "}";
}
template <typename T>
ostream& operator<<(ostream& os, const set<T>& v) {
  os << "[";
  for (auto it = v.begin(); it != v.end(); ++it) {
    if (it != v.begin()) os << ",";
    os << *it;
  }
  return os << "]";
}
template <typename T>
ostream& operator<<(ostream& os, const multiset<T>& v) {
  os << "[";
  for (auto it = v.begin(); it != v.end(); ++it) {
    if (it != v.begin()) os << ", ";
    os << *it;
  }
  return os << "]";
}
template <typename first, typename second>
ostream& operator<<(ostream& os, const map<first, second>& v) {
  os << "[";
  for (auto it = v.begin(); it != v.end(); ++it) {
    if (it != v.begin()) os << ", ";
    os << it->first << " = " << it->second;
  }
  return os << "]";
}
void faltu() { cerr << '\n'; }
template <typename T>
void faltu(T a[], int n) {
  for (int i = 0; i < n; ++i) cerr << a[i] << ' ';
  cerr << '\n';
}
template <typename T, typename... hello>
void faltu(T arg, const hello&... rest) {
  cerr << arg << ' ';
  faltu(rest...);
}
const int mx = 1e6 + 5;
vector<pair<int, char>> vec;
int nxt[mx];
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ;
  string s;
  cin >> s;
  int cnt = 1;
  for (int i = 1; i < (int)s.size(); ++i) {
    if (s[i] == s[i - 1])
      ++cnt;
    else {
      vec.push_back(make_pair(cnt, s[i - 1]));
      cnt = 1;
    }
  }
  vec.push_back(make_pair(cnt, s.back()));
  int n = (int)vec.size();
  for (int i = 0; i < n; ++i) {
    nxt[i] = i + 1;
  }
  int le = 0, ri = n - 1;
  int ans = 0;
  while (le != ri) {
    ++ans;
    for (int i = le; i <= ri; i = nxt[i]) {
      if (i == le)
        vec[i].first -= 1;
      else if (i == ri)
        vec[i].first -= 1;
      else
        vec[i].first -= 2;
      vec[i].first = max(vec[i].first, 0);
    }
    int ul_le = n + 1, ul_ri = n + 1;
    for (int i = le; i <= ri; i = nxt[i]) {
      if (vec[i].first) {
        ul_le = min(ul_le, i);
        ul_ri = i;
      }
    }
    if (ul_le == ul_ri) break;
    le = ul_le, ri = ul_ri;
    for (int i = le; i <= ri; i = nxt[i]) {
      int idx = nxt[i];
      while (idx <= ri) {
        if (vec[idx].first) break;
        idx = nxt[idx];
      }
      if (idx <= ri && vec[i].second == vec[idx].second) {
        vec[i].first += vec[idx].first;
        idx = nxt[idx];
      }
      nxt[i] = idx;
      ul_ri = i;
    }
    ri = ul_ri;
  }
  cout << ans << '\n';
}
