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: Runtime Error)

#include <bits/stdc++.h>
using namespace std;
int n, k;
int b[4005][4005], w[4005][4005];
int bsum[4005][4005], wsum[4005][4005];
int Sum(int cnt[4005][4005], int x1, int y1, int x2, int y2) {
	int ans = cnt[x2][y2] - cnt[x1][y2] - cnt[x2][y1] + cnt[x1][y1];
	return ans;
}
int main() {
	scanf("%d%d", &n, &k);
	for (int i = 0; i < n; ++ i) {
		int x, y; scanf("%d%d", &x, &y);
		x %= k * 2; y %= k * 2;
		char c[5]; scanf("%s", c);
		if (c[0] == 'B') b[x][y] ++;
		else w[x][y] ++;
	}
	for (int i = 0; i < k * 2; ++ i) {
		for (int j = 0; j < k * 2; ++ j) {
			b[i + k * 2][j] = b[i + k * 2][j + k * 2] = b[i][j + k * 2] = b[i][j];
			w[i + k * 2][j] = w[i + k * 2][j + k * 2] = w[i][j + k * 2] = w[i][j];
		}
	}
	for (int i = 1; i <= k * 4; ++ i) {
		for (int j = 1; j <= k * 4; ++ j) {
			bsum[i][j] = bsum[i - 1][j] + bsum[i][j - 1] - bsum[i - 1][j - 1] + b[i - 1][j - 1];
			wsum[i][j] = wsum[i - 1][j] + wsum[i][j - 1] - wsum[i - 1][j - 1] + w[i - 1][j - 1];
		}
	}
	int ans = 0;
	for (int x = 0; x < k * 2; ++ x) {
		for (int y = 0; y < k * 2; ++ y) {
			int B = Sum(bsum, x, y, x + k, y + k) + Sum(bsum, x + k, y + k, x + k + k, y + k + k);
			int W = Sum(wsum, x + k, y, x + k + k, y + k) + Sum(wsum, x, y + k, x + k, y + k + k);
			int sum = B + W;
			ans = max(ans, sum);
		}
	}
	printf("%d\n", ans);
	return 0;
}