#include<bits/stdc++.h>
using namespace std;
struct SA
{
vector < vector < int > > P;
vector < vector < int > > dp;
vector < pair < pair < int , int > , int > > L;
vector < int > RMAP , LG;
int N , MAXLG ;
bool save ;
string _S;
void ini()
{
int i , j ;
N = _S.length();
for(i=1;(1<<i-1)<=N;++i);
MAXLG = i;
P.resize(MAXLG);
RMAP.resize(N);
for(i=0;i<MAXLG;++i)P[i].resize(N);
L.resize(N);
for(i=0;i<N;++i)P[0][i] = _S[i];
for(i=1;i<MAXLG;++i)
{
for(j=0;j<N;++j)L[j] = {{P[i-1][j] , j + (1<<i-1) < N ? P[i-1][j+(1<<i-1)]:-1 }, j };
sort(L.begin(),L.end());
for(j=0;j<N;++j)
P[i][L[j].second] = j!=0 && L[j].first==L[j-1].first ? P[i][L[j-1].second] : j;
}
for(i=0;i<N;++i)RMAP[L[i].second] = i ;
// for(i=0;i<N;++i)
// cout<<_S.substr(L[i].second,_S.length()-L[i].second)<<'\n';
}
int compute_LCP(int x , int y )
{
if(x==y)return N - x;
int ret = 0 ;
for(int k = MAXLG-1;k>=0 && x<N && y<N;--k)
if(P[k][x]==P[k][y])
x+=(1<<k) , y+=(1<<k) , ret+=(1<<k);
return ret;
}
void compute_LCP()
{
int i , j ;
dp.resize(MAXLG);
LG.resize(N+1);
for(i=0;i<MAXLG;++i)dp[i].resize(N);
for(i=0;i<N-1;++i){
dp[0][i] = compute_LCP(L[i].second,L[i+1].second);
}
LG[1] = 0;
LG[0] = -1e9;
for(i=2;i<=N;++i)LG[i] = LG[i/2]+1;
for(i=1;i<MAXLG;++i)
for(j=0;j<N-1;++j)
dp[i][j] = min(dp[i-1][j] , (1<<i-1)+j<N-1?dp[i-1][(1<<i-1)+j]:0);
}
int query(int x , int y)
{
if(!save){
cout<<"Send second parameter as 1\n\n";
assert(0);
}
int L = x , R = y;
if(R<L)
return N - this->L[L].second;
assert(L<=R);
return min(dp[LG[(R-L+1)]][L] , dp[LG[R-L+1]][R-(1<<LG[R-L+1])+1]);
}
int query_by_index(int x , int y)
{
if(x==y)return N - x;
return query(min(RMAP[x],RMAP[y]),max(RMAP[x],RMAP[y])- 1);
}
SA(string S ,bool go = 0 ): _S(S) {ini();if(go)compute_LCP();save = go;}
bool check(int x , int len)
{
int i ;
for(i=0;i + x - 1 <N/2;++i)
if( query_by_index(i, N-i - x ) >= x)return 1;
return 0;
}
};
int main()
{
ios::sync_with_stdio(0);cin.tie(0);
int N , i , j ;
cin>>N;
string S;
cin>>S;
N = S.length();
string T = S;
reverse(T.begin(),T.end());
S += "$" + T;
SA obj1(S,1);
int L = 0 , R = (N%2==0?N:N-1)/2 , M;
while(L<R)
{
M = L + (R-L+1)/2;
if(obj1.check(M*2,N))
L = M ;
else
R = M - 1;
}
int ans = L * 2;
L = 0 ; R = (N%2==1?N:N-1)/2 , M;
while(L<R)
{
M = L + (R-L+1)/2;
if(obj1.check(M*2+1,N))
L = M ;
else
R = M - 1;
}
cout<<max(L*2+1,ans);
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKc3RydWN0IFNBCnsKICAgIHZlY3RvciA8IHZlY3RvciA8IGludCA+ID4gUDsKICAgIHZlY3RvciA8IHZlY3RvciA8IGludCA+ID4gZHA7CiAgICB2ZWN0b3IgPCBwYWlyIDwgcGFpciA8IGludCAsIGludCA+ICwgaW50ID4gPiBMOwogICAgdmVjdG9yIDwgaW50ID4gICAgUk1BUCAsIExHOwogICAgaW50IE4gICAgLCBNQVhMRyAgIDsKICAgIGJvb2wgc2F2ZSA7CiAgICBzdHJpbmcgX1M7CiAgICB2b2lkIGluaSgpCiAgICB7CiAgICAgICAgaW50IGkgLCBqIDsKICAgICAgICBOID0gX1MubGVuZ3RoKCk7CiAgICAgICAgZm9yKGk9MTsoMTw8aS0xKTw9TjsrK2kpOwogICAgICAgIE1BWExHID0gaTsKICAgICAgICBQLnJlc2l6ZShNQVhMRyk7CiAgICAgICAgUk1BUC5yZXNpemUoTik7CiAgICAgICAgZm9yKGk9MDtpPE1BWExHOysraSlQW2ldLnJlc2l6ZShOKTsKICAgICAgICBMLnJlc2l6ZShOKTsKICAgICAgICBmb3IoaT0wO2k8TjsrK2kpUFswXVtpXSA9IF9TW2ldOwoKICAgICAgICBmb3IoaT0xO2k8TUFYTEc7KytpKQogICAgICAgIHsKICAgICAgICAgICAgZm9yKGo9MDtqPE47KytqKUxbal0gPSB7e1BbaS0xXVtqXSAgLCBqICsgICgxPDxpLTEpIDwgTiA/IFBbaS0xXVtqKygxPDxpLTEpXTotMSAgfSwgaiB9OwogICAgICAgICAgICBzb3J0KEwuYmVnaW4oKSxMLmVuZCgpKTsKICAgICAgICAgICAgZm9yKGo9MDtqPE47KytqKQogICAgICAgICAgICAgICAgUFtpXVtMW2pdLnNlY29uZF0gPSBqIT0wICYmIExbal0uZmlyc3Q9PUxbai0xXS5maXJzdCA/IFBbaV1bTFtqLTFdLnNlY29uZF0gOiBqOwogICAgICAgIH0KICAgICAgICBmb3IoaT0wO2k8TjsrK2kpUk1BUFtMW2ldLnNlY29uZF0gPSBpIDsKLy8gICAgICAgIGZvcihpPTA7aTxOOysraSkKLy8gICAgICAgICAgICBjb3V0PDxfUy5zdWJzdHIoTFtpXS5zZWNvbmQsX1MubGVuZ3RoKCktTFtpXS5zZWNvbmQpPDwnXG4nOwogICAgfQogICAgaW50IGNvbXB1dGVfTENQKGludCB4ICwgaW50IHkgKQogICAgewogICAgICAgIGlmKHg9PXkpcmV0dXJuIE4gLSB4OwogICAgICAgIGludCByZXQgPSAwIDsKICAgICAgICBmb3IoaW50IGsgPSBNQVhMRy0xO2s+PTAgJiYgeDxOICYmIHk8TjstLWspCiAgICAgICAgICAgIGlmKFBba11beF09PVBba11beV0pCiAgICAgICAgICAgICAgICB4Kz0oMTw8aykgLCB5Kz0oMTw8aykgLCByZXQrPSgxPDxrKTsKICAgICAgICByZXR1cm4gcmV0OwogICAgfQoKICAgIHZvaWQgY29tcHV0ZV9MQ1AoKQogICAgewogICAgICAgIGludCBpICwgaiA7CiAgICAgICAgZHAucmVzaXplKE1BWExHKTsKICAgICAgICBMRy5yZXNpemUoTisxKTsKICAgICAgICBmb3IoaT0wO2k8TUFYTEc7KytpKWRwW2ldLnJlc2l6ZShOKTsKICAgICAgICBmb3IoaT0wO2k8Ti0xOysraSl7CiAgICAgICAgICAgIGRwWzBdW2ldID0gY29tcHV0ZV9MQ1AoTFtpXS5zZWNvbmQsTFtpKzFdLnNlY29uZCk7CiAgICAgICAgfQoKICAgICAgICBMR1sxXSA9IDA7CiAgICAgICAgTEdbMF0gPSAtMWU5OwogICAgICAgIGZvcihpPTI7aTw9TjsrK2kpTEdbaV0gPSBMR1tpLzJdKzE7CiAgICAgICAgZm9yKGk9MTtpPE1BWExHOysraSkKICAgICAgICAgICAgZm9yKGo9MDtqPE4tMTsrK2opCiAgICAgICAgICAgICAgICBkcFtpXVtqXSA9IG1pbihkcFtpLTFdW2pdICwgKDE8PGktMSkrajxOLTE/ZHBbaS0xXVsoMTw8aS0xKStqXTowKTsKICAgIH0KCiAgICBpbnQgcXVlcnkoaW50IHggLCBpbnQgeSkKICAgIHsKICAgICAgICBpZighc2F2ZSl7CiAgICAgICAgICAgIGNvdXQ8PCJTZW5kIHNlY29uZCBwYXJhbWV0ZXIgYXMgMVxuXG4iOwogICAgICAgICAgICBhc3NlcnQoMCk7CiAgICAgICAgfQogICAgICAgIGludCBMID0geCAsIFIgPSB5OwogICAgICAgIGlmKFI8TCkKICAgICAgICAgICAgcmV0dXJuIE4gLSB0aGlzLT5MW0xdLnNlY29uZDsKICAgICAgICBhc3NlcnQoTDw9Uik7CiAgICAgICAgcmV0dXJuIG1pbihkcFtMR1soUi1MKzEpXV1bTF0gLCBkcFtMR1tSLUwrMV1dW1ItKDE8PExHW1ItTCsxXSkrMV0pOwogICAgfQogICAgaW50IHF1ZXJ5X2J5X2luZGV4KGludCB4ICwgaW50IHkpCiAgICB7CiAgICAgICAgaWYoeD09eSlyZXR1cm4gTiAtIHg7CiAgICAgICAgcmV0dXJuIHF1ZXJ5KG1pbihSTUFQW3hdLFJNQVBbeV0pLG1heChSTUFQW3hdLFJNQVBbeV0pLSAxKTsKICAgIH0KICAgIFNBKHN0cmluZyBTICxib29sIGdvID0gMCApOiBfUyhTKSB7aW5pKCk7aWYoZ28pY29tcHV0ZV9MQ1AoKTtzYXZlID0gZ287fQoKICAgIGJvb2wgY2hlY2soaW50IHggLCBpbnQgbGVuKQogICAgewogICAgICAgIGludCBpIDsKICAgICAgICBmb3IoaT0wO2kgKyB4IC0gMSA8Ti8yOysraSkKICAgICAgICAgICAgaWYoIHF1ZXJ5X2J5X2luZGV4KGksIE4taSAtIHggKSA+PSB4KXJldHVybiAxOwogICAgICAgIHJldHVybiAwOwogICAgfQp9OwppbnQgbWFpbigpCnsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKDApO2Npbi50aWUoMCk7CiAgICBpbnQgTiAsICBpICAsIGogOwogICAgY2luPj5OOwogICAgc3RyaW5nIFM7CiAgICBjaW4+PlM7CiAgICBOID0gUy5sZW5ndGgoKTsKICAgIHN0cmluZyBUID0gUzsKICAgIHJldmVyc2UoVC5iZWdpbigpLFQuZW5kKCkpOwogICAgUyArPSAiJCIgKyBUOwogICAgU0Egb2JqMShTLDEpOwogICAgaW50IEwgPSAwICwgUiA9IChOJTI9PTA/TjpOLTEpLzIgLCBNOwogICAgd2hpbGUoTDxSKQogICAgewogICAgICAgIE0gPSBMICsgKFItTCsxKS8yOwogICAgICAgIGlmKG9iajEuY2hlY2soTSoyLE4pKQogICAgICAgICAgICBMID0gTSA7CiAgICAgICAgZWxzZQogICAgICAgICAgICBSID0gTSAtIDE7CiAgICB9CiAgICBpbnQgYW5zID0gTCAqIDI7CiAgICBMID0gMCA7IFIgPSAoTiUyPT0xP046Ti0xKS8yICwgTTsKICAgIHdoaWxlKEw8UikKICAgIHsKICAgICAgICBNID0gTCArIChSLUwrMSkvMjsKICAgICAgICBpZihvYmoxLmNoZWNrKE0qMisxLE4pKQogICAgICAgICAgICBMID0gTSA7CiAgICAgICAgZWxzZQogICAgICAgICAgICBSID0gTSAtIDE7CiAgICB9CiAgICBjb3V0PDxtYXgoTCoyKzEsYW5zKTsKICAgIHJldHVybiAwOwp9Cg==