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

原文地址:https://www.cnblogs.com/Jackpei/p/10659849.html