#include <bits/stdc++.h>
using namespace std;
char s[1000010];
int l[1000010];
int r[1000010];
bool vis[1000010];
set<int> com[2];
int main() {
  scanf("%s", s + 1);
  s[0] = '$';
  int len = strlen(s);
  for (int i = 0; i <= len; i++) {
    l[i] = i - 1;
    r[i] = i + 1;
  }
  int ans = 0;
  int c = 0;
  memset(vis, 0, sizeof(vis));
  bool flag = false;
  for (int i = 1; i < len; i = r[i]) {
    int x = l[i];
    if (x != 0 && s[i] != s[x]) vis[i] = flag = true;
    x = r[i];
    if (x != len && s[i] != s[x]) vis[i] = flag = true;
  }
  if (!flag) {
    printf("0\n");
    return 0;
  }
  ans++;
  com[c].clear();
  for (int i = r[0]; i < len; i = r[i]) {
    if (vis[i]) {
      r[l[i]] = r[i];
      l[r[i]] = l[i];
      if (l[i] > 0 && !vis[l[i]]) com[c].insert(l[i]);
      if (r[i] < len && !vis[r[i]]) com[c].insert(r[i]);
    }
  }
  while (true) {
    flag = false;
    for (auto i : com[c]) {
      int x = l[i];
      if (x != 0 && s[i] != s[x]) vis[i] = flag = true;
      x = r[i];
      if (x != len && s[i] != s[x]) vis[i] = flag = true;
    }
    if (!flag) break;
    ans++;
    c ^= 1;
    com[c].clear();
    for (auto i : com[c ^ 1]) {
      if (vis[i]) {
        r[l[i]] = r[i];
        l[r[i]] = l[i];
        if (l[i] > 0 && !vis[l[i]]) com[c].insert(l[i]);
        if (r[i] < len && !vis[r[i]]) com[c].insert(r[i]);
      }
    }
  }
  printf("%d\n", ans);
}
