[BZOJ4326]JOIOJI 查分+排序

看到别人做好奇点进去,随便写了没想到居然过了
没标题,实在不知道这个解法叫啥
统计前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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值