#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
int n;
struct Hash {
static const int base1 = 1e9 + 975, base2 = 1e9 + 1357;
static const int mod1 = 1e9 + 5277, mod2 = 1e9 + 7277;
vector<int> pw1, pw2, h1, h2;
void assign(const string &s) {
int n = s.size();
pw1.assign(n+1,0);
pw2.assign(n+1,0);
h1.assign(n+1,0);
h2.assign(n+1,0);
pw1[0] = pw2[0] = 1;
for(int i = 1; i <= n; i++){
pw1[i] = (pw1[i-1] * 1LL * base1) % mod1;
pw2[i] = (pw2[i-1] * 1LL * base2) % mod2;
int v = s[i-1] - 'a' + 1;
h1[i] = (h1[i-1] * 1LL * base1 + v) % mod1;
h2[i] = (h2[i-1] * 1LL * base2 + v) % mod2;
}
}
pii get(int L, int R){
int x1 = (h1[R] - h1[L-1] * 1LL * pw1[R-L+1] % mod1 + mod1) % mod1;
int x2 = (h2[R] - h2[L-1] * 1LL * pw2[R-L+1] % mod2 + mod2) % mod2;
return {x1, x2};
}
};
bool cmp(int mid, Hash &a, Hash &b){
for(int i = 1; i + mid - 1 <= n; i++)
if(a.get(i, i + mid - 1) == b.get(n - (i + mid - 1) + 1, n - i + 1)) return 1;
return 0;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
string s;
cin >> n >> s;
Hash a, b;
a.assign(s);
reverse(s.begin(), s.end());
b.assign(s);
int ans = 1;
int l = 1, r = n - n % 2;
while(l < r){
int mid = (l + r) / 2;
mid += mid % 2;
if(cmp(mid, a, b)){
l = mid;
} else r = mid - 2;
}
ans = l;
l = 2, r = n + (n % 2 == 0);
while(l < r){
int mid = (l + r) / 2;
mid += (mid % 2 == 0);
if(cmp(mid, a, b)){
l = mid;
} else r = mid - 2;
}
ans = max(ans, l);
cout << ans;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIHBpaSBwYWlyPGludCxpbnQ+CmludCBuOwpzdHJ1Y3QgSGFzaCB7CiAgICBzdGF0aWMgY29uc3QgaW50IGJhc2UxID0gMWU5ICsgOTc1LCBiYXNlMiA9IDFlOSArIDEzNTc7CiAgICBzdGF0aWMgY29uc3QgaW50IG1vZDEgPSAxZTkgKyA1Mjc3LCBtb2QyID0gMWU5ICsgNzI3NzsKICAgIHZlY3RvcjxpbnQ+IHB3MSwgcHcyLCBoMSwgaDI7CiAgICB2b2lkIGFzc2lnbihjb25zdCBzdHJpbmcgJnMpIHsKICAgICAgICBpbnQgbiA9IHMuc2l6ZSgpOwogICAgICAgIHB3MS5hc3NpZ24obisxLDApOwogICAgICAgIHB3Mi5hc3NpZ24obisxLDApOwogICAgICAgIGgxLmFzc2lnbihuKzEsMCk7CiAgICAgICAgaDIuYXNzaWduKG4rMSwwKTsKICAgICAgICBwdzFbMF0gPSBwdzJbMF0gPSAxOwogICAgICAgIGZvcihpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKXsKICAgICAgICAgICAgcHcxW2ldID0gKHB3MVtpLTFdICogMUxMICogYmFzZTEpICUgbW9kMTsKICAgICAgICAgICAgcHcyW2ldID0gKHB3MltpLTFdICogMUxMICogYmFzZTIpICUgbW9kMjsKICAgICAgICAgICAgaW50IHYgPSBzW2ktMV0gLSAnYScgKyAxOwogICAgICAgICAgICBoMVtpXSA9IChoMVtpLTFdICogMUxMICogYmFzZTEgKyB2KSAlIG1vZDE7CiAgICAgICAgICAgIGgyW2ldID0gKGgyW2ktMV0gKiAxTEwgKiBiYXNlMiArIHYpICUgbW9kMjsKICAgICAgICB9CiAgICB9CiAgICBwaWkgZ2V0KGludCBMLCBpbnQgUil7CiAgICAgICAgaW50IHgxID0gKGgxW1JdIC0gaDFbTC0xXSAqIDFMTCAqIHB3MVtSLUwrMV0gJSBtb2QxICsgbW9kMSkgJSBtb2QxOwogICAgICAgIGludCB4MiA9IChoMltSXSAtIGgyW0wtMV0gKiAxTEwgKiBwdzJbUi1MKzFdICUgbW9kMiArIG1vZDIpICUgbW9kMjsKICAgICAgICByZXR1cm4ge3gxLCB4Mn07CiAgICB9Cn07Cgpib29sIGNtcChpbnQgbWlkLCBIYXNoICZhLCBIYXNoICZiKXsKCWZvcihpbnQgaSA9IDE7IGkgKyBtaWQgLSAxIDw9IG47IGkrKykgCglpZihhLmdldChpLCBpICsgbWlkIC0gMSkgPT0gYi5nZXQobiAtIChpICsgbWlkIC0gMSkgKyAxLCBuIC0gaSArIDEpKSByZXR1cm4gMTsKCXJldHVybiAwOwoJCn0KCnNpZ25lZCBtYWluKCl7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwoKICAgIAogICAgc3RyaW5nIHM7CiAgICBjaW4gPj4gbiA+PiBzOwoKICAgIEhhc2ggYSwgYjsKICAgIGEuYXNzaWduKHMpOwogICAgcmV2ZXJzZShzLmJlZ2luKCksIHMuZW5kKCkpOwogICAgYi5hc3NpZ24ocyk7CgogICAgaW50IGFucyA9IDE7CiAgICBpbnQgbCA9IDEsIHIgPSBuIC0gbiAlIDI7CiAgICB3aGlsZShsIDwgcil7CiAgICAgICAgaW50IG1pZCA9IChsICsgcikgLyAyOwogICAgICAgIG1pZCArPSBtaWQgJSAyOwogICAgICAgIGlmKGNtcChtaWQsIGEsIGIpKXsKICAgICAgICAgICAgbCA9IG1pZDsKICAgICAgICB9IGVsc2UgIHIgPSBtaWQgLSAyOwogICAgfQogICAgYW5zID0gbDsKICAgIGwgPSAyLCByID0gbiArIChuICUgMiA9PSAwKTsKICAgIHdoaWxlKGwgPCByKXsKICAgICAgICBpbnQgbWlkID0gKGwgKyByKSAvIDI7CiAgICAgICAgbWlkICs9IChtaWQgJSAyID09IDApOwogICAgICAgIGlmKGNtcChtaWQsIGEsIGIpKXsKICAgICAgICAgICAgbCA9IG1pZDsKICAgICAgICB9IGVsc2UgIHIgPSBtaWQgLSAyOwogICAgfQoJYW5zID0gbWF4KGFucywgbCk7CiAgICBjb3V0IDw8IGFuczsKICAgIHJldHVybiAwOwp9Cg==