def rolling_hash(s: str): """[l, r] のハッシュを返す関数を返す""" mod = 998244353 p = 1009 n = len(s) t = [ord(c) for c in s] a = [0] * n b = [0] * n a[0] = t[0] b[0] = 1 for i in range(1, n): a[i] = (a[i-1] * p + t[i]) % mod b[i] = (p * b[i-1]) % mod # [l, r] のハッシュ値 def f(l: int, r: int) -> int: assert 0 <= l <= r < n h = a[r] if l > 0: h -= a[l-1] * b[r-l+1] h %= mod return h return f class PalindromeRH: def __init__(self, s: str): self.n = len(s) self.h = rolling_hash(s) self.rh = rolling_hash(s[::-1]) def query(self, l: int, r: int) -> bool: """区間 [l, r] が回文か""" n = self.n return self.h(l, r) == self.rh(n-r-1, n-l-1) S = input() n = len(S) pal = PalindromeRH(S) dp = [-1] * n dp[0] = 1 for i in range(n): if pal.query(0, i): dp[i] = i+1 for j in range(i): if dp[j] == -1: continue if pal.query(j+1, i): w = i - (j+1) + 1 dp[i] = max(dp[i], min(w, dp[j])) ans = dp[n-1] print(ans)