Problem:
Score : 500 points

Problem Statement

You are given a string S consisting of 0 and 1.
Find the maximum integer K not greater than |S| such that we can turn all the characters of S into 0 by repeating the following operation some number of times.

Choose a contiguous segment [l,r] in S whose length is at least K (that is, r-l+1\geq K must be satisfied). For each integer i such that l\leq i\leq r, do the following: if S_i is 0, replace it with 1; if S_i is 1, replace it with 0.

Constraints

1\leq |S|\leq 10^5

S_i(1\leq i\leq N) is either 0 or 1.

Input

Input is given from Standard Input in the following format:

S

Output

Print the maximum integer K such that we can turn all the characters of S into 0 by repeating the operation some number of times.

Sample Input 1

010

Sample Output 1

2

We can turn all the characters of S into 0 by the following operations:

Perform the operation on the segment S[1,3] with length 3. S is now 101.

Perform the operation on the segment S[1,2] with length 2. S is now 011.

Perform the operation on the segment S[2,3] with length 2. S is now 000.

Sample Input 2

100000000

Sample Output 2

8

Sample Input 3

00001111

Sample Output 3

4

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
 
using namespace std;
inline void prep ()
{
  cin.tie (0);
  cin.sync_with_stdio (0);
};
const double pi = acos(-1.);
//printf(%.12lf\n,mid);
// __builtin_popcount(int) count 1's in binary
// get decimal part of number
/*
double intpart;
double thiss = modf((double)(n*m)/(double)k, &intpart);
*/
// round = (int)(num+.5)
long long mod = 1000000007;
 
long long mymod(long long num){
  if (num< 0 && !(num%mod == 0)){
    if (mod == 1){
      return 0;
    }
    return mod-abs(num)%mod;
  }else{
    return num%mod;
  }
}
 
/*string sentence = And I feel fine...;
    istringstream iss(sentence);
*/  
 
double eps = .000000001;

int main(){
  prep();
  string s;
  cin >> s;
  if (s[0] == '1'){
      for (int i=0; i<s.size(); i++){
          if (s[i] == '1'){
              s[i] = '0';
          }else{
              s[i] = '1';
          }
      }
  }
  int n = s.size();
  vector<int> intervals;
  int white[n] = {0};
  int black[n] = {0};
  for (int i=0; i<n; i++){
      if (i == 0){
          if (s[i] == '0'){
              white[i] = 1;
          }else{
              black[i] = 1;
          }
      }else{
          if (s[i] == '0'){
              white[i] += 1+white[i-1];
              if (white[i-1] == 0){
                  intervals.push_back(black[i-1]);
              }
          }else{
              black[i] += 1+black[i-1];
              if (black[i-1] == 0){
                  intervals.push_back(white[i-1]);
              }
          }
      }
  }
  if (s[n-1] == '0'){
      intervals.push_back(white[n-1]);
  }else{
      intervals.push_back(black[n-1]);
  }
  multiset<int> sizes;
  int sum = n;
  vector<int> order;
  for (int i=0; i<intervals.size(); i++){
      sizes.insert(sum);
      order.push_back(sum);
      sum -= intervals[i];
      
  }
  int maxest = *(sizes.begin());
  sum = n;
  for (int i=intervals.size()-1; i>=0; i--){
      sizes.insert(n);
      sizes.insert(sum-intervals[i]);
      sizes.erase(sizes.find(order[i]));
      maxest = max(maxest, *(sizes.begin()));
      sum -= intervals[i];
  }
  cout << maxest;
  return 0; 
}