#include <bits/stdc++.h>
using namespace std;
long long powmod(long long a, long long b, long long mod) {
  long long res = 1;
  a %= mod;
  assert(b >= 0);
  for (; b; b >>= 1) {
    if (b & 1) res = res * a % mod;
    a = a * a % mod;
  }
  return res;
}
long long gcd(long long a, long long b) {
  if (b == 0)
    return a;
  else
    return gcd(b, a % b);
}
const int INF = 0x3f3f3f3f;
const int MAXN = 1000005;
int pre[MAXN], nxt[MAXN], n, now;
char ch[MAXN];
int on[MAXN];
queue<int> qqq[2];
bool check(int i) {
  if (~pre[i] && ch[pre[i]] != ch[i]) return true;
  if (~nxt[i] && ch[nxt[i]] != ch[i]) return true;
  return false;
}
void del(int i) {
  if (on[i] > 1) return;
  if (~pre[i]) {
    nxt[pre[i]] = nxt[i];
    if (!on[pre[i]]) qqq[now].push(pre[i]);
  }
  if (~nxt[i]) {
    pre[nxt[i]] = pre[i];
    if (!on[nxt[i]]) qqq[now].push(nxt[i]);
  }
  on[i]++;
}
int main() {
  scanf("%s", ch);
  int n = strlen(ch);
  for (int i = (0); i < (n); i++) {
    pre[i] = i - 1;
    nxt[i] = i + 1;
    qqq[now ^ 1].push(i);
  }
  nxt[n - 1] = -1;
  now ^= 1;
  int ans = 0;
  while (!qqq[now].empty()) {
    ans++;
    while (!qqq[now].empty()) {
      int x = qqq[now].front();
      qqq[now].pop();
      if (!on[x] && check(x)) qqq[now ^ 1].push(x), on[x] = 1;
    }
    if (qqq[now ^ 1].empty()) ans--;
    while (!qqq[now ^ 1].empty()) {
      int x = qqq[now ^ 1].front();
      qqq[now ^ 1].pop();
      del(x);
    }
  }
  printf("%d\n", ans);
  return 0;
}
