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\n",ans);
}

2019.04.05

转载于:https://www.cnblogs.com/Jackpei/p/10659849.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值