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

  • 相关阅读:
    1270. 数列区间最大值(climits用法+线段树模板题)
    JDBC&DBCP总结
    1264. 动态求连续区间和(树状数组模板题)
    788. 逆序对的数量(归并排序的应用)
    归并排序(模板题)
    ZoomEye技巧
    工具或安全监测网站(不定时更新)
    bp截包
    CTF/web
    CTF/stega——图片隐写
  • 原文地址:https://www.cnblogs.com/Jackpei/p/10659849.html
Copyright © 2011-2022 走看看