BZOJ4236&&洛谷AT1224 JOIOJI

版权声明:我这么弱的蒟蒻,虽然博文不是很好,但也请标明转发地址喵! https://blog.csdn.net/ACerAndAKer/article/details/82714203

STL大法好%%%po姐

存一个sum[i][0/1/2],表示前i位有多少个J/O/I然后做差丢进一个map里,记录最早出现时间,对每个位置在map里查一下

代码

//By AcerMo
#include<map>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int M=200500;
int n,ans;
char s[M];
int sum[M][3];
map<pair<int,int>,int>num;
int main()
{
    cin>>n;
    scanf("%s",s+1);
    num[make_pair(0,0)]=0;
    for(int i=1;i<=n;i++)
    {
        sum[i][0]=sum[i-1][0]+(s[i]=='J');
        sum[i][1]=sum[i-1][1]+(s[i]=='O');
        sum[i][2]=sum[i-1][2]+(s[i]=='I');
        if (num.find(make_pair(sum[i][0]-sum[i][1],sum[i][1]-sum[i][2]))==num.end())
        num[make_pair(sum[i][0]-sum[i][1],sum[i][1]-sum[i][2])]=i;
        else ans=max(ans,i-num[make_pair(sum[i][0]-sum[i][1],sum[i][1]-sum[i][2])]);
    }
    cout<<ans<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/ACerAndAKer/article/details/82714203