s = input().strip() n = len(s) # Precompute palindrome array 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 else: if s[i] == s[j]: if j == i + 1: pal[i][j] = True else: pal[i][j] = pal[i+1][j-1] # Precompute split_valid array split_valid = [[False] * n for _ in range(n)] for i in range(n-1, -1, -1): for j in range(i, n): if i == j: split_valid[i][j] = True else: if pal[i][j]: split_valid[i][j] = True else: for k in range(i, j): if pal[i][k] and split_valid[k+1][j]: split_valid[i][j] = True break # Collect all possible palindromic substrings and sort by length descending candidates = [] for i in range(n): for j in range(i, n): if pal[i][j]: candidates.append((j - i + 1, i, j)) candidates.sort(reverse=True, key=lambda x: x[0]) max_len = 0 found = False for length, i, j in candidates: if length == n: continue # Skip the whole string as it's not allowed left_possible = False right_possible = False if i > 0: left_possible = split_valid[0][i-1] if j < n-1: right_possible = split_valid[j+1][n-1] if left_possible or right_possible: max_len = length found = True break if found: print(max_len) else: # If no split possible other than individual characters, result is 1 print(1)