#include <bits/stdc++.h>
using namespace std;
// O(N^3) naive
int solveNaive(vector<int> v) {
const int n = v.size();
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
unordered_map<int, int> cnt;
int max_cnt = 0;
for (int k = i; k <= j; k++) {
cnt[v[k]]++;
max_cnt = max(max_cnt, cnt[v[k]]);
}
if (max_cnt >= j-i-2) {
ans = max(ans, j-i+1);
}
}
}
return ans;
}
// O(N^2) naive
int solveNaiveLittleOpt(vector<int> v) {
const int n = v.size();
int ans = 0;
for (int i = 0; i < n; i++) {
unordered_map<int, int> cnt;
int max_cnt = 0;
for (int j = i; j < n; j++) {
cnt[v[j]]++;
max_cnt = max(max_cnt, cnt[v[j]]);
if (max_cnt >= j-i-2) {
ans = max(ans, j-i+1);
}
}
}
return ans;
}
// O(NlgN)
int solve(vector<int> v) {
unordered_map<int, int> cnt;
multiset<int> pq;
const int n = v.size();
int l = 0, r = 0;
int ans = 0;
while (r < n) {
cnt[v[r]]++;
pq.insert(cnt[v[r]]);
while(*pq.rbegin() < r-l-2) {
auto iter = pq.find(cnt[v[l]]);
pq.erase(iter);
cnt[v[l]]--;
pq.insert(cnt[v[l]]);
l++;
}
ans = max(ans, r-l+1);
r++;
}
return ans;
}
// O(N) given element of v is in [-10, 10]
int solveOpt(vector<int> v) {
vector<int> cnt(21, 0);
multiset<int> pq;
const int n = v.size();
int l = 0, r = 0;
int ans = 0;
while (r < n) {
cnt[v[r]+10]++;
while(*max_element(cnt.begin(), cnt.end()) < r-l-2) {
cnt[v[l]+10]--;
l++;
}
ans = max(ans, r-l+1);
r++;
}
return ans;
}
int main() {
cout<<solveOpt({-9, 8})<<endl;
cout<<solveOpt({1, 1, -10, 3, -10, 3, -10})<<endl;
cout<<solveOpt({2, 3, 3, 3, 3, 1})<<endl;
cout<<solveOpt({3, 3, 2, 1, 2, 2, 9, 3, 3})<<endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBPKE5eMykgbmFpdmUKaW50IHNvbHZlTmFpdmUodmVjdG9yPGludD4gdikgewoJY29uc3QgaW50IG4gPSB2LnNpemUoKTsKCWludCBhbnMgPSAwOwoJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKCQlmb3IgKGludCBqID0gaTsgaiA8IG47IGorKykgewoJCQl1bm9yZGVyZWRfbWFwPGludCwgaW50PiBjbnQ7CgkJCWludCBtYXhfY250ID0gMDsKCQkJZm9yIChpbnQgayA9IGk7IGsgPD0gajsgaysrKSB7CgkJCQljbnRbdltrXV0rKzsKCQkJCW1heF9jbnQgPSBtYXgobWF4X2NudCwgY250W3Zba11dKTsKCQkJfQoJCQlpZiAobWF4X2NudCA+PSBqLWktMikgewoJCQkJYW5zID0gbWF4KGFucywgai1pKzEpOwoJCQl9CgkJfQoJfQoJcmV0dXJuIGFuczsKfQoKLy8gTyhOXjIpIG5haXZlCmludCBzb2x2ZU5haXZlTGl0dGxlT3B0KHZlY3RvcjxpbnQ+IHYpIHsKCWNvbnN0IGludCBuID0gdi5zaXplKCk7CglpbnQgYW5zID0gMDsKCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CgkJdW5vcmRlcmVkX21hcDxpbnQsIGludD4gY250OwoJCWludCBtYXhfY250ID0gMDsKCQlmb3IgKGludCBqID0gaTsgaiA8IG47IGorKykgewoJCQljbnRbdltqXV0rKzsKCQkJbWF4X2NudCA9IG1heChtYXhfY250LCBjbnRbdltqXV0pOwoJCQlpZiAobWF4X2NudCA+PSBqLWktMikgewoJCQkJYW5zID0gbWF4KGFucywgai1pKzEpOwoJCQl9CgkJfQoJfQoJcmV0dXJuIGFuczsKfQoKLy8gTyhObGdOKQppbnQgc29sdmUodmVjdG9yPGludD4gdikgewoJdW5vcmRlcmVkX21hcDxpbnQsIGludD4gY250OwoJbXVsdGlzZXQ8aW50PiBwcTsKCWNvbnN0IGludCBuID0gdi5zaXplKCk7CglpbnQgbCA9IDAsIHIgPSAwOwoJaW50IGFucyA9IDA7Cgl3aGlsZSAociA8IG4pIHsKCQljbnRbdltyXV0rKzsKCQlwcS5pbnNlcnQoY250W3Zbcl1dKTsKCQl3aGlsZSgqcHEucmJlZ2luKCkgPCByLWwtMikgewoJCQlhdXRvIGl0ZXIgPSBwcS5maW5kKGNudFt2W2xdXSk7CgkJCXBxLmVyYXNlKGl0ZXIpOwoJCQljbnRbdltsXV0tLTsKCQkJcHEuaW5zZXJ0KGNudFt2W2xdXSk7CgkJCWwrKzsKCQl9CgkJYW5zID0gbWF4KGFucywgci1sKzEpOwoJCXIrKzsKCX0KCXJldHVybiBhbnM7Cn0KCi8vIE8oTikgZ2l2ZW4gZWxlbWVudCBvZiB2IGlzIGluIFstMTAsIDEwXQppbnQgc29sdmVPcHQodmVjdG9yPGludD4gdikgewoJdmVjdG9yPGludD4gY250KDIxLCAwKTsKCW11bHRpc2V0PGludD4gcHE7Cgljb25zdCBpbnQgbiA9IHYuc2l6ZSgpOwoJaW50IGwgPSAwLCByID0gMDsKCWludCBhbnMgPSAwOwoJd2hpbGUgKHIgPCBuKSB7CgkJY250W3Zbcl0rMTBdKys7CgkJd2hpbGUoKm1heF9lbGVtZW50KGNudC5iZWdpbigpLCBjbnQuZW5kKCkpIDwgci1sLTIpIHsKCQkJY250W3ZbbF0rMTBdLS07CgkJCWwrKzsKCQl9CgkJYW5zID0gbWF4KGFucywgci1sKzEpOwoJCXIrKzsKCX0KCXJldHVybiBhbnM7Cn0KIAppbnQgbWFpbigpIHsKCWNvdXQ8PHNvbHZlT3B0KHstOSwgOH0pPDxlbmRsOwoJY291dDw8c29sdmVPcHQoezEsIDEsIC0xMCwgMywgLTEwLCAzLCAtMTB9KTw8ZW5kbDsKCWNvdXQ8PHNvbHZlT3B0KHsyLCAzLCAzLCAzLCAzLCAxfSk8PGVuZGw7Cgljb3V0PDxzb2x2ZU9wdCh7MywgMywgMiwgMSwgMiwgMiwgOSwgMywgM30pPDxlbmRsOwoJcmV0dXJuIDA7Cn0=