看到别人做好奇点进去,随便写了没想到居然过了
没标题,实在不知道这个解法叫啥
统计前i位’J’的个数x,’O’的个数y,’I’的个数z
两两差分得到二元组
#include <iostream>
#include <cstdio>
#include <algorithm>
#define N 1000050
using namespace std;
struct sn{ int a,b,_; }Q[N];
bool operator != (sn p1,sn p2) {
return p1.a != p2.a || p1.b != p2.b;
}
int n;
char s[N];
bool cmp(sn p1,sn p2) {
if (p1.a != p2.a) return p1.a < p2.a;
if (p1.b != p2.b) return p1.b < p2.b;
return p1._ < p2._;
}
int main() {
scanf("%d",&n);
scanf("%s",s+1);
int x = 0 , y = 0 , z = 0;
for (int i=1;i<=n;i++) {
s[i] == 'J' ? x++ : 0;
s[i] == 'O' ? y++ : 0;
s[i] == 'I' ? z++ : 0;
Q[i] = (sn){y-x,z-y,i};
}
sort(Q,Q+n+1,cmp);
int h = 0 , t = -1 , ans = 0;
while (++t <= n) {
while (Q[h] != Q[t]) h++;
ans = max(ans , Q[t]._ - Q[h]._);
}
printf("%d\n",ans);
return 0;
}