[题解]luogu_AT1224_JOIOJI

https://www.cnblogs.com/fengzhiyuan/p/7588443.html

不会map,有点菜

1.要想知道三个字母出现次数相等, 为J [ i ]-J [ j ]== O[ i ]-O[ j ] == I [ i ]- I [ j ],移项得 J[ i ]-O[ i ]=J[ j ]-O[ j ] 其他同理

2.于是我们可以把每个  J[ i ]-O[ i ],O[ i ]-I[ i ]的二元组映射成出现这个组的位置,长度即为i-出现位置

至于为什么会想到哈希/map,还要问问dalao们才行

#include<iostream>
#include<cstdio>
#include<map>
#define mp make_pair
using namespace std;
int n,ans;
char s[200010];
int sum[3][200010];//出現次數和 
map<pair<int,int>,int>m;//把出現次數差的二元組映射為出現位置處 
int main()
{
    scanf("%d",&n);
    scanf("%s",s+1);
    m[mp(0,0)]=0;
    for(int 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( mp(sum[0][i]-sum[1][i],sum[1][i]-sum[2][i]) ) == m.end())//如果map里沒有這個二元組 
        m[mp(sum[0][i]-sum[1][i],sum[1][i]-sum[2][i])]=i;//插入 
        else ans=max(ans,i-m[mp(sum[0][i]-sum[1][i],sum[1][i]-sum[2][i])]);//找到了更新ans,即為i-那次出現位置,也就是長度 
    }
    printf("%d
",ans);
}
原文地址:https://www.cnblogs.com/superminivan/p/10663238.html