zoukankan      html  css  js  c++  java
  • [题解]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);
    }
  • 相关阅读:
    提升ASP.NET性能
    人性的弱点
    墨菲定律
    沟通
    网站
    程序员思维模式
    CSS
    HTML
    路由和数据传递(04)
    Sql Server中查看所有数据库,表名,字段名以及字段类型
  • 原文地址:https://www.cnblogs.com/superminivan/p/10663238.html
Copyright © 2011-2022 走看看