#include <bits/stdc++.h>
using namespace std;
const int INF = 1000000404;
const long long MOD = 1000000007ll;
const long double PI = acos(-1.0);
const long double EPS = 1e-9;
template <typename t1, typename t2>
inline void upmax(t1 &a, t2 b) {
  a = max(a, (t1)b);
}
template <typename t1, typename t2>
inline void upmin(t1 &a, t2 b) {
  a = min(a, (t1)b);
}
template <typename T>
inline T gcd(T a, T b) {
  return b ? gcd(b, a % b) : a;
}
template <typename T>
inline T lcm(T a, T b) {
  return a * (b / gcd(a, b));
}
template <typename T>
inline T sqr(T a) {
  return a * a;
}
template <typename T>
inline bool pal(T &x) {
  int n = (int((x.size())));
  for (int i = 0; i < n / 2; i++) {
    if (x[i] != x[n - i - 1]) return 0;
  }
  return 1;
}
template <typename T>
inline void rev(T &x) {
  int n = (int((x.size())));
  for (int i = 0; i < n / 2; i++) swap(x[i], x[n - i - 1]);
}
int month[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int dx[] = {1, 0, -1, 0, 1, 1, -1, -1};
int dy[] = {0, 1, 0, -1, 1, -1, 1, -1};
inline long long mp(long long a, long long b) { return (a << 31) + b; }
class compare {
 public:
  bool operator()(const int a, const int b) const { return 1; }
};
int SQ = 400;
int nxt[1111111];
int prv[1111111];
int first[1111111];
int last[1111111];
char c[1111111];
void solve() {
  string s;
  cin >> s;
  int n = (int((s.size())));
  list<pair<int, char> > l;
  int len = 0;
  for (int i = 0; i < n; i++) {
    if (len == 0) {
      len = 1;
    } else {
      if (s[i] == s[i - 1])
        len++;
      else {
        l.push_back(make_pair(len, s[i - 1]));
        len = 1;
      }
    }
  }
  if (len != 0) l.push_back(make_pair(len, s[n - 1]));
  bool deleted = false;
  int answer = 0;
  do {
    deleted = false;
    int now = 0;
    for (auto &x : l) x.first -= 2;
    l.begin()->first++;
    l.rbegin()->first++;
    list<pair<int, char> >::iterator it = l.begin();
    while (it != l.end()) {
      if (it->first <= 0) {
        it = l.erase(it);
        deleted = true;
      } else
        it++;
    }
    char last = '@';
    int lastcnt = 0;
    it = l.begin();
    while (it != l.end()) {
      if (last == it->second) {
        int s = it->first + lastcnt;
        it--;
        it = l.erase(it);
        last = it->second;
        lastcnt = it->first = s;
        it++;
      } else {
        last = it->second;
        lastcnt = it->first;
        it++;
      }
    }
    answer++;
  } while ((int((l.size()))) > 1);
  cout << answer;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int t = 1;
  while (t--) {
    solve();
  };
  getchar();
  getchar();
  return 0;
}
