#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; void add(unordered_map &m, const string &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 main() { ios::sync_with_stdio(false); cin.tie(NULL); string S; getline(cin, S); int ans = 0; constexpr int NGRAM = 5; unordered_map cnt[NGRAM]; int l = 0, r = (int)S.length() - 1; while(l < r) { int slen = -1; for(int len = 1; l + len - 1 < r - len + 1; ++len) { bool empt = true; for(int nlen = 1; nlen <= min(NGRAM, len); ++nlen) { add(cnt[nlen - 1], S.substr(l + len - 1 - (nlen - 1), nlen), 1); add(cnt[nlen - 1], S.substr(r - len + 1, nlen), -1); empt = empt && cnt[nlen - 1].empty(); } if(empt) { bool eq = true; for(int j = 0; j < len && eq; ++j) eq = eq && S[l + j] == S[r - len + 1 + j]; if(eq) { slen = len; ans += 2; break; } } } if(slen < 0) break; else l += slen, r -= slen; } if(l <= r) ++ans; cout << ans << endl; return 0; }