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