[BZOJ4326]JOIOJI 查分+排序

来源:互联网 发布:python多线程加锁 编辑:程序博客网 时间:2024/04/29 18:29

看到别人做好奇点进去,随便写了没想到居然过了
没标题,实在不知道这个解法叫啥
统计前i位’J’的个数x,’O’的个数y,’I’的个数z
两两差分得到二元组

#include <iostream>#include <cstdio>#include <algorithm>#define N 1000050using 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;} 
0 0