import java.io.OutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.BufferedWriter;
import java.util.Set;
import java.util.InputMismatchException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.io.Writer;
import java.io.OutputStreamWriter;
import java.io.InputStream;

/**
 * Built using CHelper plug-in Actual solution is at the top
 *
 * @author @Ziklon
 */
public class Main {
  public static void main(String[] args) {
    InputStream inputStream = System.in;
    OutputStream outputStream = System.out;
    InputReader in = new InputReader(inputStream);
    OutputWriter out = new OutputWriter(outputStream);
    AColorfulPoints solver = new AColorfulPoints();
    solver.solve(1, in, out);
    out.close();
  }

  static class AColorfulPoints {
    Set<Integer> sx;
    char[] s;
    int N;
    int[][] lr;

    void update(int p) {
      if (p == 0 || p == N + 1) return;

      if (sx.contains(p)) sx.remove(p);
      if (lr[p][0] != 0 && s[p] != s[lr[p][0]]) sx.add(p);
      if (lr[p][1] != N + 1 && s[p] != s[lr[p][1]]) sx.add(p);
    }

    public void solve(int testNumber, InputReader in, OutputWriter out) {
      s = (" " + in.readString()).toCharArray();
      N = s.length - 1;
      lr = new int[N + 5][2];
      sx = new HashSet<>();
      for (int i = 1; i <= N; ++i) {
        if (i != 1 && s[i] != s[i - 1]) sx.add(i);
        if (i != N && s[i] != s[i + 1]) sx.add(i);
        lr[i][0] = i - 1;
        lr[i][1] = i + 1;
      }

      for (int i = 0; ; ++i) {
        if (sx.isEmpty()) {
          out.printLine(i);
          return;
        }
        List<Integer> items = new ArrayList<>(sx);
        for (int e : items) {
          int t1 = lr[e][0], t2 = lr[e][1];

          lr[t1][1] = t2;
          lr[t2][0] = t1;
          update(t1);
          update(t2);
          sx.remove(e);
        }
      }
    }
  }

  static class OutputWriter {
    private final PrintWriter writer;

    public OutputWriter(OutputStream outputStream) {
      writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(outputStream)));
    }

    public OutputWriter(Writer writer) {
      this.writer = new PrintWriter(writer);
    }

    public void close() {
      writer.close();
    }

    public void printLine(int i) {
      writer.println(i);
    }
  }

  static class InputReader {
    private InputStream stream;
    private byte[] buf = new byte[1024];
    private int curChar;
    private int numChars;
    private InputReader.SpaceCharFilter filter;

    public InputReader(InputStream stream) {
      this.stream = stream;
    }

    public int read() {
      if (numChars == -1) {
        throw new InputMismatchException();
      }
      if (curChar >= numChars) {
        curChar = 0;
        try {
          numChars = stream.read(buf);
        } catch (IOException e) {
          throw new InputMismatchException();
        }
        if (numChars <= 0) {
          return -1;
        }
      }
      return buf[curChar++];
    }

    public String readString() {
      int c = read();
      while (isSpaceChar(c)) {
        c = read();
      }
      StringBuilder res = new StringBuilder();
      do {
        if (Character.isValidCodePoint(c)) {
          res.appendCodePoint(c);
        }
        c = read();
      } while (!isSpaceChar(c));
      return res.toString();
    }

    public boolean isSpaceChar(int c) {
      if (filter != null) {
        return filter.isSpaceChar(c);
      }
      return isWhitespace(c);
    }

    public static boolean isWhitespace(int c) {
      return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
    }

    public interface SpaceCharFilter {
      public boolean isSpaceChar(int ch);
    }
  }
}
