import java.util.*;
import java.io.*;
import java.math.*;

public class Main {

    static Scanner input = new Scanner(new BufferedReader(new InputStreamReader(System.in)));

    public static void main(String[] args) {
        String s = input.next();
        char last = s.charAt(0);
        ArrayList<region> regions = new ArrayList<region>();
        region tmp = new region();
        tmp.color = last;
        tmp.size = 1;
        for (int i = 1; i < s.length(); i++) {
            if (s.charAt(i) != last) {
                regions.add(tmp);
                tmp = new region();
                last = s.charAt(i);
                tmp.color = last;
                tmp.size = 1;
            } else {
                tmp.size++;
            }
        }
        regions.add(tmp);
        System.out.println(solve(regions));
    }

    static class region {

        public char color;
        public int size;
    }

    static int solve(ArrayList<region> regions) {
        if (regions.size() < 2) {
            return 0;
        } else if (regions.size() == 2) {
            return Math.min(regions.get(0).size, regions.get(1).size);
        } else {
            int min = regions.get(1).size;
            ArrayList<region> res = new ArrayList<region>();
            for (int i = 2; i < regions.size() - 1; i++) {
                if (regions.get(i).size < min) {
                    min = regions.get(i).size;
                }
            }
            if (regions.get(0).size * 2 < min) {
                int deleted = 2 * regions.get(0).size;
                for (int i = 1; i < regions.size(); i++) {
                    regions.get(i).size -= deleted;
                }
                regions.get(regions.size() - 1).size += deleted / 2;
                regions.get(0).size = 0;
                for (int i = 0; i < regions.size(); i++) {
                    if (regions.get(i).size != 0) {
                        res.add(regions.get(i));
                    }
                }
                return deleted / 2 + solve(res);
            } else if (regions.get(regions.size() - 1).size * 2 < min) {
                int deleted = 2 * regions.get(regions.size() - 1).size;
                for (int i = regions.size() - 2; i >= 1; i--) {
                    regions.get(i).size -= deleted;
                }
                regions.get(regions.size() - 1).size = 0;
                regions.get(0).size -= deleted / 2;
                for (int i = 0; i < regions.size(); i++) {
                    if (regions.get(i).size != 0) {
                        res.add(regions.get(i));
                    }
                }
                return deleted / 2 + solve(res);
            } else {
                min = 2 * (min / 2 + min % 2);
                regions.get(regions.size() - 1).size += min / 2;
                regions.get(0).size += min / 2;
                for (int i = 0; i < regions.size(); i++) {
                    regions.get(i).size -= min;
                }
                for (int i = 0; i < regions.size(); i++) {
                    if (regions.get(i).size > 0) {
                        if (res.size() > 0
                                && res.get(res.size() - 1).color == regions.get(i).color) {
                            res.get(res.size() - 1).size += regions.get(i).size;
                        } else {
                            res.add(regions.get(i));
                        }
                    }
                }
                return (min / 2) + min % 2 + solve(res);
            }
        }
    }
}