#include #include using namespace std; int chc(char ch) { return 1 << (ch - 'a'); } int main() { int N; scanf("%d\n", &N); int start = -1, koniec = -1, result = 0; unsigned int p[N+1], prev =0; map myMap; myMap[0] = 0; p[0] = 0; for (int i = 1; i <= N; i++) { char pivo = getc(stdin); int newBeer = chc(pivo); // prepocitaj novy stav p[i] = prev ^ newBeer; prev = p[i]; // daj do dict-u prvy znamy stav a jeho vyskyt if (! myMap.count(p[i])) { myMap[p[i]] = i; } //printf("PI: %d. %d\n", i, p[i]); } //pod od konca a hladaj PODOBNY stav for (int i = N; i >= result; i--) { for (char j = 'a'; j <= 't'; j++) { int pokusnePivo = p[i] ^ chc(j); if (myMap.count(pokusnePivo)) { start = myMap[pokusnePivo]; koniec = i; if (result < koniec - start + 1) { //printf("1 %d %d\n", start, koniec); result = koniec - start + 1; } } } if (myMap.count(p[i])) { start = myMap[p[i]]; koniec = i; if (result < koniec - start + 1) { //printf("2 %d %d\n", start, koniec); result = koniec - start + 1; } } } printf("%d\n", result == 1 ? result : result-1); return 0; }