#include <bits/stdc++.h>
using namespace std;
struct node {
  char c;
  int cnt;
  node() {}
  node(char c, int cnt) : c(c), cnt(cnt) {}
};
int main() {
  string s;
  cin >> s;
  vector<node> st, stt;
  set<char> w;
  char now = s[0];
  int cnt = 1;
  for (int i = 1; i < s.size(); i++) {
    if (s[i] == now)
      cnt++;
    else {
      st.push_back(node(now, cnt));
      now = s[i];
      cnt = 1;
    }
  }
  st.push_back(node(now, cnt));
  if (st.size() == 1) return cout << 0, 0;
  if (st.size() == 2) return cout << min(st[0].cnt, st[1].cnt), 0;
  int ans = 0;
  while (1) {
    ans++;
    if (st[0].cnt > 1)
      stt.push_back(node(st[0].c, st[0].cnt - 1)), w.insert(st[0].c);
    for (int i = 1; i < st.size() - 1; i++) {
      if (st[i].cnt > 2)
        stt.push_back(node(st[i].c, st[i].cnt - 2)), w.insert(st[i].c);
    }
    if (st[st.size() - 1].cnt > 1)
      stt.push_back(node(st[st.size() - 1].c, st[st.size() - 1].cnt - 1)),
          w.insert(st[st.size() - 1].c);
    if (stt.size() <= 1) break;
    if (w.size() == 1) break;
    w.clear();
    st = stt;
    stt.clear();
    if (st.size() == 2) {
      ans += min(st[0].cnt, st[1].cnt);
      break;
    }
  }
  cout << ans;
  return 0;
}
