#include <bits/stdc++.h>
#include <fstream>

#define endl "\n"
#define pb push_back
#define mp make_pair
#define fs first
#define sc second
#define all(x) (x).begin(),(x).end()
#define rect return 0
#define pause cout << endl; system("pause")
#define FAST ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define sz(x) (int)(x).size()
#define Pi acos(-1.0)
#define bitcount __builtin_popcountll

#define TupleGet(name, index) std::get<(index)>(name)
#define FOR(a, b, c) for(int (a) = (b); (a) < (c); ++(a))
#define FORs(a, b, c) for(int (a) = (b); (a) <= (c); ++(a))
#define revFOR(a, b, c) for(int (a) = (b); (a) > (c); --(a))
#define revFORs(a, b, c) for(int (a) = (b); (a) >= (c); --(a))
#define foreach(it, a) for(auto it = (a).begin(); it != (a).end(); it++)

using namespace std;

// *** TYPEDEF'S, CONSTANTS AND FUNCTIONS *** //
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<pair<int, int>> vpii;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef tuple<int, int, int> tii;
typedef vector<vector<int> > vvi;

/* |T| |I| |P| |S|
@ string abc = "abcdefghijklmnopqrstuvwxyz";
@ 'char' - 'a' ::: порядковый номер латинской буквы
@ 'digit' - '0' or 'digit' - 48 ::: (char) ---> (int)
@ 'A' = dec 65 'Z' = dec 90
  'a' = dec 97 'z' = dec 122
  '0' = dec 48 '9' = dec 57
@ Если страдает скорость ввода:
1) ios::sync_with_stdio(0);
   cin.tie(0);
2) юзать сканф
@ для стринга перевод i-того символа в другой регистр: a[i] = char (a[i] +- 32)  :::  32 == 'a' - 'A'
@ int n (m знаков) :::  n[1] = n / 10^(m-1) ; n[m] = n % 10 ; n[m-1] = (n % 100)/10 ; n[m-2] = (n % 1000)/100...
@ cout << fixed << setprecision(n) ::: n знаков после запятой, без "fixed" - всего n знаков
@ abs(x-y) < EPS ::: равентсво вещественных чисел x и y по точности EPS
@ x + EPS < y  или  x - EPS < y ::: сравнение больше-меньше для вещественных чисел по точности EPS
@ если цифру можешь записать из головы - так и пиши в программе, иначе - пиши ФОРМУЛУ
@ «экспонента» - целое число, показывающее, на сколько надо сдвинуть десятичную запятую в числе ::: 123e2 = 12300 , 123e-4 = 0.0123
@ если задача плохо решается при нумерации с единицы, иногда оказывается намного проще перейти к нумерации с нуля.
  Особенно задачах, где явно надо делить на равные части.
@ while(cin >>)  |||  while (getline(cin, )) ::: считывание, пока даются данные
@ ctrl+Z ::: конец файла в консоли
@ Глобальные массивы, чтобы не было ошибок; размер брать с запасом
@ Количество цифр N числа X в b-ичной записи, N = floor[ log[b](X) ] + 1
@ ios::sync_with_stdio(0); //ввод
@ cin.tie(0); cout.tie(0); //могут быть проблемы в интерактивных задачах (частый ввод-вывод)
*/

void calc(const ll &n, const vector<pll> &a) {
    vector<ll> dist(n, 0);
    dist[0] = a[0].fs;
    FOR(i, 1, n) dist[i] = dist[i - 1] + a[i].fs;

    vector<ll> eat(n, 0);
    eat[0] = a[0].sc;
    FOR(i, 1, n) eat[i] = eat[i - 1] + a[i].sc;


}

void ARC096_D_Sushi() {
    ll n, c;
    cin >> n >> c;

    vector<pll> a(n);
    FOR(i, 0, n)cin >> a[i].fs >> a[i].sc;


}

void Edu42_D() {
    ll n;
    cin >> n;

    vll a(n);
    FOR(i, 0, n)cin >> a[i];

    map<ll, ll> cnt;
    FOR(i, 0, n) cnt[a[i]]++;

    map<ll, stack<int> > last_pos;
    FOR(i, 0, n) {
        last_pos[a[i]].push(i);
    }

    ll mx = -1;
    for (auto it : cnt) {
        ll cur_num = it.fs, cur_cnt = it.sc;

        mx = max(cur_num, mx);

        if (cur_cnt % 2 == 0) {
            if (last_pos[2 * cur_num].top() < last_pos[cur_num].top()) {
                last_pos[2 * cur_num].push(last_pos[cur_num].top());
            } else {
                int tmp = last_pos[cur_num].top();

            }
            last_pos[cur_num].push(-1);

            cnt[cur_num] = 0;
            cnt[2 * cur_num] += (cur_cnt / 2);
        } else {

        }

        if (cur_cnt > 0) cnt[2 * cur_num] += (cur_cnt / 2);
    }

    reverse(all(a));

    vll ans;
    FOR(i, 0, n) {
        if (cnt[a[i]] == 0) {
            ll cur_num = a[i];

            while (cnt[cur_num] == 0 && cur_num <= mx) cur_num <<= 1;

            if (cur_num <= mx && cnt[cur_num] == 1) {
                ans.pb(cur_num);
                cnt[cur_num]--;
            }
        } else {
            ans.pb(a[i]);
            cnt[a[i]]--;
        }
    }

    reverse(all(ans));
    cout << sz(ans) << endl;
    for (auto it : ans) {
        cout << it << " ";
    }
}

bool check(const string &s, const int &m) {
    const int n = sz(s);
    string tmp = s;

    int i = 0;

    int swaps = 0;
    for (i = n - 1; i >= m - 1; --i) {
        if ((tmp[i] == '0' && swaps % 2 == 1) || (tmp[i] == '1' && swaps % 2 == 0)) {
            swaps++;
        }
    }
    for (i = m - 1; i < n; i++) tmp[i] = '0';
    for (i = 0; i < m - 1; i++) {
        if (swaps % 2 == 1) {
            tmp[i] = (tmp[i] == '0' ? '1' : '0');
        }
    }

    swaps = 0;
    for (i = 0; i < m - 1 && (n - i >= m); i++) {
        if ((tmp[i] == '0' && swaps % 2 == 1) || (tmp[i] == '1' && swaps % 2 == 0)) {
            swaps++;
        }
    }
    for (i = 0; i < m - 1 && (n - i >= m); i++) tmp[i] = '0';
    for (int j = i; j < n; j++) {
        if (swaps % 2 == 1) {
            tmp[j] = (tmp[j] == '0' ? '1' : '0');
        }
    }

    vi res;
    i = -1;
    while (i < n - 1) {
        i++;
        int len = 1;
        while (tmp[i] == tmp[i + 1]) {
            len++;
            i++;
        }
        res.pb(len);
    }

    bool ok = false;
    for (i = 0; i < sz(res); i++) {
        if (res[i] >= m) {
            ok = true;
        }
    }

    return ok;
}

int bs(const string &s) {
    int l = 1, r = sz(s) + 1;
    while (r - l > 1) {
        int m = l + (r - l) / 2;
        if (check(s, m)) {
            l = m;
        } else {
            r = m;
        }
    }
    return l;
}

void solve() {
    string s;
    cin >> s;
    cout << bs(s);
}

int main() {
    solve();
    return 0;
}

Measured memory_bytes: 640