zoukankan      html  css  js  c++  java
  • BZOJ 4236: JOIOJI map瞎搞

    分别记录J,O,I,的个数

    cnt[char][i] 表示处理到第i位,char的个数

    显然当且仅当

      cnt[J][i] - cnt[O][i] == cnt[J][j-1] - cnt[O][j-1]  &&  cnt[O][i] - cnt[I][i] == cnt[O][j-1] - cnt[I][j-1] 时

    i到j位是一个长为i-j+1的合法串

    于是把状态压到一个 long long 里 map瞎搞就行

    没去掉调试输出导致WA了四次QAQ

    #include<cstdio>
    #include<iostream>
    #include<map>
    #define R register int
    using namespace std;
    map<long long,int>mp;
    int n,ans,cnt[3];
    inline int fx(char ch) { if(ch=='J') return 0; if(ch=='O') return 1; if(ch=='I') return 2;}
    signed main() {
        register char ch; 
        scanf("%d",&n); R nn=n;
        mp[1000000000000000]=-1;
        while(!isalpha(ch=getchar()));
        do { --n;
            ++cnt[fx(ch)]; //cout<<ch<<" "<<fx(ch)<<endl; 
            R pos=mp[(cnt[0]-cnt[1])*800000+cnt[1]-cnt[2]+1000000000000000];
            if(!pos) mp[(cnt[0]-cnt[1])*800000+cnt[1]-cnt[2]+1000000000000000]=nn-n;//,cout<<nn-n<<endl;
            else ans=max(ans,nn-n-pos+(pos==-1?-1:0));//,cout<<"aaasskk:"<<ans<<endl; cout<<"ans:"<<ans<<endl;
            //cout<<cnt[0]<<" "<<cnt[1]<<" "<<cnt[2]<<" "<<(cnt[0]-cnt[1])*800000+cnt[1]-cnt[2]+1000000000000000<<endl;
            //cout<<mp[(cnt[0]-cnt[1])*800000+cnt[1]-cnt[2]]<<endl;
        } while(n>=1&&isalpha(ch=getchar())); 
        //cout<<"^^^^^^"
        printf("%d
    ",ans);
    }

    2019.04.05

  • 相关阅读:
    展望2018
    Android按下home键后重新打开app进入主activity的问题
    RxJava整合Retrofit遇到的问题总结
    【总结】四种逆元的求法
    【NOIP模板汇总】I Am Me
    【总结】两类素数筛详解
    【NOIP2009】最优贸易
    【SHOI2002】滑雪
    【51NOD1398】等公交
    【复习总结】玫瑰人生 La Vie en Rose
  • 原文地址:https://www.cnblogs.com/Jackpei/p/10659849.html
Copyright © 2011-2022 走看看