#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
template < class S, class T> inline S min_L( S a,T b) {
return a<= b? a: b;
}
template < class T> void malloc1d( T ** arr, int x) {
( * arr) = ( T* ) malloc ( x* sizeof ( T) ) ;
}
template < class T> void free1d( T * arr) {
free ( arr) ;
}
template < class S, class T> inline S chmax( S & a, T b) {
if ( a< b) {
a= b;
}
return a;
}
template < class T> struct Grid1d{
T * d, * d_s;
int * dw, * lf, n, * rg, set_d, set_s, * up;
void malloc ( const int nn) {
n = nn;
set_s = 0 ;
set_d = 0 ;
malloc1d( & d, n) ;
}
void free ( void ) {
free1d( d) ;
if ( set_s) {
free1d( d_s) ;
}
if ( set_d) {
free1d( up) ;
free1d( dw) ;
}
}
T& operator[ ] ( int a) {
return d[ a] ;
}
void setSum( void ) {
int i;
if ( set_s == 0 ) {
set_s = 1 ;
malloc2d( & d_s, n+ 1 ) ;
}
d_s[ 0 ] = 0 ;
for ( i= 0 ; i< ( n) ; i++ ) {
d_s[ i+ 1 ] = d_s[ i] + d[ i] ;
}
}
void setDir( void ) {
int i;
if ( set_d == 0 ) {
set_d = 1 ;
malloc1d( & up, n) ;
malloc1d( & dw, n) ;
lf = dw;
rg = up;
}
lf[ 0 ] = 1 ;
for ( i= ( 1 ) ; i< ( n) ; i++ ) {
if ( d[ i] == d[ i- 1 ] ) {
lf[ i] = 1 + lf[ i- 1 ] ;
}
else {
lf[ i] = 1 ;
}
}
rg[ n- 1 ] = 1 ;
for ( i= n- 2 ; i>= 0 ; i-- ) {
if ( d[ i] == d[ i+ 1 ] ) {
rg[ i] = 1 + rg[ i+ 1 ] ;
}
else {
rg[ i] = 1 ;
}
}
}
void setDirMatch( const T v) {
int i;
if ( set_d == 0 ) {
set_d = 1 ;
malloc1d( & up, n) ;
malloc1d( & dw, n) ;
lf = dw;
rg = up;
}
if ( d[ 0 ] == v) {
lf[ 0 ] = 1 ;
}
else {
lf[ 0 ] = 0 ;
}
for ( i= ( 1 ) ; i< ( n) ; i++ ) {
if ( d[ i] == v) {
lf[ i] = 1 + lf[ i- 1 ] ;
}
else {
lf[ i] = 0 ;
}
}
if ( d[ n- 1 ] == v) {
rg[ n- 1 ] = 1 ;
}
else {
rg[ n- 1 ] = 0 ;
}
for ( i= n- 2 ; i>= 0 ; i-- ) {
if ( d[ i] == v) {
rg[ i] = 1 + rg[ i+ 1 ] ;
}
else {
rg[ i] = 0 ;
}
}
}
inline T getSum( const int a, const int b) {
return d_s[ b+ 1 ] - d_s[ a] ;
}
}
;
#define main dummy_main
int main( ) {
return 0 ;
}
#undef main
class Solution{
public :
int maxRepOpt1( string S) {
Grid1d< int > g;
int N, cnt[ 26 ] = { } , i, j, k, res= 0 ;
N = S.size ( ) ;
for ( i= 0 ; i< ( N) ; i++ ) {
S[ i] - = 'a' ;
}
for ( i= 0 ; i< ( N) ; i++ ) {
cnt[ S[ i] ] ++ ;
}
g.malloc ( N) ;
for ( i= 0 ; i< ( N) ; i++ ) {
g[ i] = S[ i] ;
}
g.setDir ( ) ;
for ( i= 0 ; i< ( N) ; i++ ) {
j = i - g.dw [ i] ;
k = g.dw [ i] ;
if ( j>= 0 ) {
k++ ;
j-- ;
if ( j>= 0 && g[ i] == g[ j] ) {
k + = g.dw [ j] ;
}
}
chmax( res, min_L( k, cnt[ g[ i] ] ) ) ;
j = i + g.up [ i] ;
k = g.up [ i] ;
if ( j< N) {
k++ ;
j++ ;
if ( j< N && g[ i] == g[ j] ) {
k + = g.up [ j] ;
}
}
chmax( res, min_L( k, cnt[ g[ i] ] ) ) ;
}
g.free ( ) ;
return res;
}
}
;
// cLay varsion 20190818-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// class Solution {
// public:
// int maxRepOpt1(string S) {
// int i, j, k, N, res = 0;
// int cnt[26] = {};
// Grid1d<int> g;
//
// N = S.size();
// rep(i,N) S[i] -= 'a';
// rep(i,N) cnt[S[i]]++;
//
// g.malloc(N);
// rep(i,N) g[i] = S[i];
// g.setDir();
//
// rep(i,N){
// j = i - g.dw[i];
// k = g.dw[i];
// if(j>=0){
// k++;
// j--;
// if(j>=0 && g[i]==g[j]) k += g.dw[j];
// }
// res >?= min(k, cnt[g[i]]);
//
// j = i + g.up[i];
// k = g.up[i];
// if(j<N){
// k++;
// j++;
// if(j<N && g[i]==g[j]) k += g.up[j];
// }
// res >?= min(k, cnt[g[i]]);
// }
//
// g.free();
// return res;
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnRlbXBsYXRlPGNsYXNzIFMsIGNsYXNzIFQ+IGlubGluZSBTIG1pbl9MKFMgYSxUIGIpewogIHJldHVybiBhPD1iP2E6YjsKfQp0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIG1hbGxvYzFkKFQgKiphcnIsIGludCB4KXsKICAoKmFycikgPSAoVCopbWFsbG9jKHgqc2l6ZW9mKFQpKTsKfQp0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIGZyZWUxZChUICphcnIpewogIGZyZWUoYXJyKTsKfQp0ZW1wbGF0ZTxjbGFzcyBTLCBjbGFzcyBUPiBpbmxpbmUgUyBjaG1heChTICZhLCBUIGIpewogIGlmKGE8Yil7CiAgICBhPWI7CiAgfQogIHJldHVybiBhOwp9CnRlbXBsYXRlPGNsYXNzIFQ+IHN0cnVjdCBHcmlkMWR7CiAgVCAqZCwgKmRfczsKICBpbnQgKmR3LCAqbGYsIG4sICpyZywgc2V0X2QsIHNldF9zLCAqdXA7CiAgdm9pZCBtYWxsb2MoY29uc3QgaW50IG5uKXsKICAgIG4gPSBubjsKICAgIHNldF9zID0gMDsKICAgIHNldF9kID0gMDsKICAgIG1hbGxvYzFkKCZkLCBuKTsKICB9CiAgdm9pZCBmcmVlKHZvaWQpewogICAgZnJlZTFkKGQpOwogICAgaWYoc2V0X3MpewogICAgICBmcmVlMWQoZF9zKTsKICAgIH0KICAgIGlmKHNldF9kKXsKICAgICAgZnJlZTFkKHVwKTsKICAgICAgZnJlZTFkKGR3KTsKICAgIH0KICB9CiAgVCYgb3BlcmF0b3JbXShpbnQgYSl7CiAgICByZXR1cm4gZFthXTsKICB9CiAgdm9pZCBzZXRTdW0odm9pZCl7CiAgICBpbnQgaTsKICAgIGlmKHNldF9zID09IDApewogICAgICBzZXRfcyA9IDE7CiAgICAgIG1hbGxvYzJkKCZkX3MsIG4rMSk7CiAgICB9CiAgICBkX3NbMF0gPSAwOwogICAgZm9yKGk9MDtpPChuKTtpKyspewogICAgICBkX3NbaSsxXSA9IGRfc1tpXSArIGRbaV07CiAgICB9CiAgfQogIHZvaWQgc2V0RGlyKHZvaWQpewogICAgaW50IGk7CiAgICBpZihzZXRfZCA9PSAwKXsKICAgICAgc2V0X2QgPSAxOwogICAgICBtYWxsb2MxZCgmdXAsIG4pOwogICAgICBtYWxsb2MxZCgmZHcsIG4pOwogICAgICBsZiA9IGR3OwogICAgICByZyA9IHVwOwogICAgfQogICAgbGZbMF0gPSAxOwogICAgZm9yKGk9KDEpO2k8KG4pO2krKyl7CiAgICAgIGlmKGRbaV09PWRbaS0xXSl7CiAgICAgICAgbGZbaV0gPSAxICsgbGZbaS0xXTsKICAgICAgfQogICAgICBlbHNlewogICAgICAgIGxmW2ldID0gMSA7CiAgICAgIH0KICAgIH0KICAgIHJnW24tMV0gPSAxOwogICAgZm9yKGk9bi0yO2k+PTA7aS0tKXsKICAgICAgaWYoZFtpXT09ZFtpKzFdKXsKICAgICAgICByZ1tpXSA9IDEgKyByZ1tpKzFdOwogICAgICB9CiAgICAgIGVsc2V7CiAgICAgICAgcmdbaV0gPSAxIDsKICAgICAgfQogICAgfQogIH0KICB2b2lkIHNldERpck1hdGNoKGNvbnN0IFQgdil7CiAgICBpbnQgaTsKICAgIGlmKHNldF9kID09IDApewogICAgICBzZXRfZCA9IDE7CiAgICAgIG1hbGxvYzFkKCZ1cCwgbik7CiAgICAgIG1hbGxvYzFkKCZkdywgbik7CiAgICAgIGxmID0gZHc7CiAgICAgIHJnID0gdXA7CiAgICB9CiAgICBpZihkWzBdPT12KXsKICAgICAgbGZbMF0gPTE7CiAgICB9CiAgICBlbHNlewogICAgICBsZlswXSA9MDsKICAgIH0KICAgIGZvcihpPSgxKTtpPChuKTtpKyspewogICAgICBpZihkW2ldPT12KXsKICAgICAgICBsZltpXSA9MSArIGxmW2ktMV07CiAgICAgIH0KICAgICAgZWxzZXsKICAgICAgICBsZltpXSA9MDsKICAgICAgfQogICAgfQogICAgaWYoZFtuLTFdPT12KXsKICAgICAgcmdbbi0xXSA9MTsKICAgIH0KICAgIGVsc2V7CiAgICAgIHJnW24tMV0gPTA7CiAgICB9CiAgICBmb3IoaT1uLTI7aT49MDtpLS0pewogICAgICBpZihkW2ldPT12KXsKICAgICAgICByZ1tpXSA9MSArIHJnW2krMV07CiAgICAgIH0KICAgICAgZWxzZXsKICAgICAgICByZ1tpXSA9MDsKICAgICAgfQogICAgfQogIH0KICBpbmxpbmUgVCBnZXRTdW0oY29uc3QgaW50IGEsIGNvbnN0IGludCBiKXsKICAgIHJldHVybiBkX3NbYisxXSAtIGRfc1thXTsKICB9Cn0KOwojZGVmaW5lIG1haW4gZHVtbXlfbWFpbgppbnQgbWFpbigpewogIHJldHVybiAwOwp9CiN1bmRlZiBtYWluCmNsYXNzIFNvbHV0aW9uewogIHB1YmxpYzoKICBpbnQgbWF4UmVwT3B0MShzdHJpbmcgUyl7CiAgICBHcmlkMWQ8aW50PiBnOwogICAgaW50IE4sIGNudFsyNl09e30sIGksIGosIGssIHJlcz0wOwogICAgTiA9IFMuc2l6ZSgpOwogICAgZm9yKGk9MDtpPChOKTtpKyspewogICAgICBTW2ldIC09ICdhJzsKICAgIH0KICAgIGZvcihpPTA7aTwoTik7aSsrKXsKICAgICAgY250W1NbaV1dKys7CiAgICB9CiAgICBnLm1hbGxvYyhOKTsKICAgIGZvcihpPTA7aTwoTik7aSsrKXsKICAgICAgZ1tpXSA9IFNbaV07CiAgICB9CiAgICBnLnNldERpcigpOwogICAgZm9yKGk9MDtpPChOKTtpKyspewogICAgICBqID0gaSAtIGcuZHdbaV07CiAgICAgIGsgPSBnLmR3W2ldOwogICAgICBpZihqPj0wKXsKICAgICAgICBrKys7CiAgICAgICAgai0tOwogICAgICAgIGlmKGo+PTAgJiYgZ1tpXT09Z1tqXSl7CiAgICAgICAgICBrICs9IGcuZHdbal07CiAgICAgICAgfQogICAgICB9CiAgICAgIGNobWF4KHJlcywgbWluX0woaywgY250W2dbaV1dKSk7CiAgICAgIGogPSBpICsgZy51cFtpXTsKICAgICAgayA9IGcudXBbaV07CiAgICAgIGlmKGo8Til7CiAgICAgICAgaysrOwogICAgICAgIGorKzsKICAgICAgICBpZihqPE4gJiYgZ1tpXT09Z1tqXSl7CiAgICAgICAgICBrICs9IGcudXBbal07CiAgICAgICAgfQogICAgICB9CiAgICAgIGNobWF4KHJlcywgbWluX0woaywgY250W2dbaV1dKSk7CiAgICB9CiAgICBnLmZyZWUoKTsKICAgIHJldHVybiByZXM7CiAgfQp9CjsKLy8gY0xheSB2YXJzaW9uIDIwMTkwODE4LTEKCi8vIC0tLSBvcmlnaW5hbCBjb2RlIC0tLQovLyAjZGVmaW5lIG1haW4gZHVtbXlfbWFpbgovLyB7fQovLyAjdW5kZWYgbWFpbgovLyAKLy8gY2xhc3MgU29sdXRpb24gewovLyBwdWJsaWM6Ci8vICAgaW50IG1heFJlcE9wdDEoc3RyaW5nIFMpIHsKLy8gICAgIGludCBpLCBqLCBrLCBOLCByZXMgPSAwOwovLyAgICAgaW50IGNudFsyNl0gPSB7fTsKLy8gICAgIEdyaWQxZDxpbnQ+IGc7Ci8vIAovLyAgICAgTiA9IFMuc2l6ZSgpOwovLyAgICAgcmVwKGksTikgU1tpXSAtPSAnYSc7Ci8vICAgICByZXAoaSxOKSBjbnRbU1tpXV0rKzsKLy8gCi8vICAgICBnLm1hbGxvYyhOKTsKLy8gICAgIHJlcChpLE4pIGdbaV0gPSBTW2ldOwovLyAgICAgZy5zZXREaXIoKTsKLy8gCi8vICAgICByZXAoaSxOKXsKLy8gICAgICAgaiA9IGkgLSBnLmR3W2ldOwovLyAgICAgICBrID0gZy5kd1tpXTsKLy8gICAgICAgaWYoaj49MCl7Ci8vICAgICAgICAgaysrOwovLyAgICAgICAgIGotLTsKLy8gICAgICAgICBpZihqPj0wICYmIGdbaV09PWdbal0pIGsgKz0gZy5kd1tqXTsKLy8gICAgICAgfQovLyAgICAgICByZXMgPj89IG1pbihrLCBjbnRbZ1tpXV0pOwovLyAKLy8gICAgICAgaiA9IGkgKyBnLnVwW2ldOwovLyAgICAgICBrID0gZy51cFtpXTsKLy8gICAgICAgaWYoajxOKXsKLy8gICAgICAgICBrKys7Ci8vICAgICAgICAgaisrOwovLyAgICAgICAgIGlmKGo8TiAmJiBnW2ldPT1nW2pdKSBrICs9IGcudXBbal07Ci8vICAgICAgIH0KLy8gICAgICAgcmVzID4/PSBtaW4oaywgY250W2dbaV1dKTsKLy8gICAgIH0KLy8gCi8vICAgICBnLmZyZWUoKTsKLy8gICAgIHJldHVybiByZXM7Ci8vICAgfQovLyB9Owo=