#include #include #include using namespace std; using namespace __gnu_pbds; using ll = long long; using ld = long double; using ii = pair; using vi = vector; using vvi = vector; using vii = vector; using vvii = vector; template using min_heap = priority_queue, greater>; template using order_tree = tree, rb_tree_tag, tree_order_statistics_node_update>; constexpr int INF = 2000000010; constexpr ll LLINF = 9000000000000000010LL; template void add(unordered_map &m, const T &s, int c) { auto it = m.find(s); if (it == m.end()) m[s] += c; else { it->second += c; if (it->second == 0) m.erase(it); } } int combine(char c1, char c2) { return int(c1-'0') + 10 * int(c2-'0'); } int combine(char c1, char c2, char c3) { return int(c1-'0') + 10 * int(c2-'0') + 100 * int(c3-'0'); } int main() { ios::sync_with_stdio(false); cin.tie(NULL); string S; getline(cin, S); int ans = 0; unordered_map cnt1; unordered_map cnt2; unordered_map cnt3; int l = 0, r = (int)S.length()-1; while (l < r) { bool ok = false; for (int i = 0; l + i < r - i; ++i) { add(cnt1, S[l+i], 1); add(cnt1, S[r-i], -1); if (i > 0) { add(cnt2, combine(S[l+i-1], S[l+i]), 1); add(cnt2, combine(S[r-i], S[r-i+1]), -1); } if (i > 1) { add(cnt3, combine(S[l+i-2], S[l+i-1], S[l+i]), 1); add(cnt3, combine(S[r-i], S[r-i+1], S[r-i+2]), -1); } if (cnt1.empty() && cnt2.empty() && cnt3.empty()) { l += i + 1; r -= i + 1; ans += 2; ok = true; break; } } if (!ok) break; } if (l <= r) ++ans; cout << ans << endl; return 0; }