s = input().strip() n = len(s) # Precompute palindrome table pal = [[False] * n for _ in range(n)] for i in range(n-1, -1, -1): for j in range(i, n): if i == j: pal[i][j] = True elif i + 1 == j: pal[i][j] = (s[i] == s[j]) else: pal[i][j] = (s[i] == s[j] and pal[i+1][j-1]) low = 1 high = n max_x = 0 while low <= high: mid = (low + high) // 2 dp = [False] * (n + 1) dp[0] = True # empty prefix for i in range(1, n + 1): end_j = i - mid if end_j >= 0: found = False for j in range(end_j, -1, -1): if dp[j] and pal[j][i-1]: dp[i] = True found = True break # If found, dp[i] is True; else remains False if dp[n]: max_x = mid low = mid + 1 else: high = mid - 1 print(max_x)