BZOJ 4236 JOIOJI

    xiaoxiao2021-03-25  112

    又找到一道水题,好开心

    这题你就直接前缀和记录JOI分别出现的次数

    然后把J的个数减去O的个数,O的个数减去I的个数

    然后存到map里直接找一组相同的且相差最远的一组值即为答案

    显然sumJ-sumO相等,那么这一段区间中sumJ-sumO==0同理sumO-sumI=0

    那么sumJ==sumO==sumI

    下面是代码(能过算我输)

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

    转载请注明原文地址: https://ju.6miu.com/read-21875.html

    最新回复(0)