#ifndef LOCAL #pragma GCC optimize("O3") #endif #include using namespace std; #define sim template muu & operator<<( #define ris return *this #define R22(r) sim> typename enable_if<1 r sizeof(dud(0)),muu&>::type operator<<(c g) { sim> struct rge {c b, e;}; sim> rge range(c i, c j) {return rge{i, j};} sim> auto dud(c*r)->decltype(cerr << *r); sim> char dud(...); struct muu { #ifdef LOCAL stringstream a; ~muu() {cerr << a.str() << endl;} R22(<) a << boolalpha << g; ris;} R22(==) ris << range(begin(g), end(g));} sim mor rge u) { a << "["; for (c i = u.b; i != u.e; ++i) *this << ", " + 2 * (i == u.b) << *i; ris << "]"; } sim, class b mor pair r){ris << "(" << r.first << ", " << r.second << ")";} #else sim mor const c&){ris;} #endif }; #define debug muu() << __FUNCTION__ << "#" << __LINE__ << ": " #define imie(r...) "[" #r ": " << (r) << "] " #define range(a, b) "[[" #a ", " #b "): " << range(a, b) << "] " #define arr(a, i) "[" #a imie(i) ": " << a[i] << "] " using ll = long long; using ld = long double; using pii = pair ; const int maxn = 1e6; void Manacher(const char *s, int n, int r[]) { for (int i = 0, m = 0, k = 0, p = 0; i < 2 * n - 1; m = i++ - 1) { while (p < k and i / 2 + r[m] != k) r[i++] = min(r[m--], (k + 1 - p++) / 2); while (k + 1 < n and p > 0 and s[k + 1] == s[p - 1]) k++, p--; r[i] = (k + 1 - p++) / 2; } } char buff[maxn]; int n; int proms[maxn]; bool is_pal(int p, int k) { return proms[p + k] >= (k - p + 1) / 2; } int main() { scanf("%d", &n); scanf("%s", buff); Manacher(buff, n, proms); int res = n-1; for(int i = n - 1; i >= 0; --i) { if(is_pal(i, n-1)) res = i; } printf("%d\n", res); }