#include <bits/stdc++.h>
using namespace std;
char frq[1000005];
int len[1000005];
int prv[1000005];
int nxt[1000005];
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  string st;
  cin >> st;
  set<pair<pair<pair<int, int>, char>, pair<int, int>>> cps;
  int i = 1, j = 0, prs = -1, cnt = 0, fi = 0, fj = 0;
  while (i < st.size()) {
    if (st[i] != st[i - 1]) {
      if (j == 0) {
        cps.insert({{{(i - j) * 2, j}, st[i - 1]}, {prs, i}});
        len[j] = (i - j) * 2;
      } else {
        cps.insert({{{i - j, j}, st[i - 1]}, {prs, i}});
        len[j] = i - j;
      }
      frq[j] = st[i - 1];
      prv[i] = j;
      nxt[j] = i;
      prs = j;
      j = i;
    }
    i++;
  }
  prv[0] = -1;
  nxt[j] = -1;
  frq[j] = st[i - 1];
  len[j] = (i - j) * 2;
  len[-1] = 0;
  cps.insert({{{(i - j) * 2, j}, st[i - 1]}, {prs, -1}});
  i = 0;
  while (cps.size() > 1) {
    auto it = cps.begin();
    auto it2 = cps.begin();
    int lnt = it->first.first.first;
    if (lnt % 2) {
      it2 = cps.lower_bound({{{lnt + 2, 0}, 'a'}, {-1, -1}});
    } else {
      it2 = cps.lower_bound({{{lnt + 1, 0}, 'a'}, {-1, -1}});
    }
    it2--;
    cnt = ((lnt + 1) / 2);
    int stp = it2->first.first.first;
    while (it->first.first.first <= stp) {
      int stt = it->first.first.second;
      if (stt == i) {
        fi++;
        i = nxt[i];
      }
      if (stt == j) {
        fj++;
        j = prv[j];
      }
      if (it->second.first != -1 && it->second.second != -1) {
        if (frq[prv[stt]] == frq[nxt[stt]]) {
          lnt = len[prv[stt]] + len[nxt[stt]] - (cnt * 2);
          if (prv[prv[stt]] == -1 || nxt[nxt[stt]] == -1) lnt -= 2;
          cps.erase({{{len[prv[stt]], prv[stt]}, frq[prv[stt]]},
                     {prv[prv[stt]], stt}});
          cps.erase({{{len[nxt[stt]], nxt[stt]}, frq[nxt[stt]]},
                     {stt, nxt[nxt[stt]]}});
          cps.insert({{{lnt, prv[stt]}, frq[prv[stt]]},
                      {prv[prv[stt]], nxt[nxt[stt]]}});
          if (nxt[nxt[stt]] != -1) {
            cps.erase(
                {{{len[nxt[nxt[stt]]], nxt[nxt[stt]]}, frq[nxt[nxt[stt]]]},
                 {nxt[stt], nxt[nxt[nxt[stt]]]}});
            cps.insert(
                {{{len[nxt[nxt[stt]]], nxt[nxt[stt]]}, frq[nxt[nxt[stt]]]},
                 {prv[stt], nxt[nxt[nxt[stt]]]}});
          }
          len[prv[stt]] = lnt;
          prv[nxt[nxt[stt]]] = prv[stt];
          nxt[prv[stt]] = nxt[nxt[stt]];
        } else {
          cps.erase({{{len[prv[stt]], prv[stt]}, frq[prv[stt]]},
                     {prv[prv[stt]], stt}});
          cps.insert({{{len[prv[stt]], prv[stt]}, frq[prv[stt]]},
                      {prv[prv[stt]], nxt[stt]}});
          cps.erase({{{len[nxt[stt]], nxt[stt]}, frq[nxt[stt]]},
                     {stt, nxt[nxt[stt]]}});
          cps.insert({{{len[nxt[stt]], nxt[stt]}, frq[nxt[stt]]},
                      {prv[stt], nxt[nxt[stt]]}});
          prv[nxt[stt]] = prv[stt];
          nxt[prv[stt]] = nxt[stt];
        }
      } else if (it->second.first != -1) {
        cps.erase(
            {{{len[prv[stt]], prv[stt]}, frq[prv[stt]]}, {prv[prv[stt]], stt}});
        cps.insert({{{len[prv[stt]], prv[stt]}, frq[prv[stt]]},
                    {prv[prv[stt]], nxt[stt]}});
        prv[nxt[stt]] = prv[stt];
        nxt[prv[stt]] = nxt[stt];
      } else if (it->second.second != -1) {
        cps.erase(
            {{{len[nxt[stt]], nxt[stt]}, frq[nxt[stt]]}, {stt, nxt[nxt[stt]]}});
        cps.insert({{{len[nxt[stt]], nxt[stt]}, frq[nxt[stt]]},
                    {prv[stt], nxt[nxt[stt]]}});
        prv[nxt[stt]] = prv[stt];
        nxt[prv[stt]] = nxt[stt];
      }
      cps.erase(
          {{{it->first.first.first, it->first.first.second}, it->first.second},
           {it->second.first, it->second.second}});
      if (cps.size() < 2) break;
      it = cps.begin();
    }
    if (i == j || cps.size() < 2)
      break;
    else if (fi && fj) {
      cps.insert({{{2 * (len[i] - cnt), i}, frq[i]}, {prv[i], nxt[i]}});
      cps.insert({{{2 * (len[j] - cnt), j}, frq[j]}, {prv[j], nxt[j]}});
      cps.erase({{{len[i], i}, frq[i]}, {prv[i], nxt[i]}});
      cps.erase({{{len[j], j}, frq[j]}, {prv[j], nxt[j]}});
      fi = 0;
      fj = 0;
    } else if (fi) {
      cps.insert({{{2 * (len[i] - cnt), i}, frq[i]}, {prv[i], nxt[i]}});
      cps.erase({{{len[i], i}, frq[i]}, {prv[i], nxt[i]}});
      fi = 0;
    } else if (fj) {
      cps.insert({{{2 * (len[j] - cnt), j}, frq[j]}, {prv[j], nxt[j]}});
      cps.erase({{{len[j], j}, frq[j]}, {prv[j], nxt[j]}});
      fj = 0;
    }
  }
  cout << cnt << "\n";
  return 0;
}
