4236: JOIOJI 思路题 map
来源:互联网 发布:手机电子狗软件那个准 编辑:程序博客网 时间:2024/05/17 07:13
一开始sb了写的hash+二分,后来突然反应过来这个答案根本不能二分啊QAQ。
因为答案为len,长度小于len的并不一定满足QAQ,我真是sb。
其实想到二分是看着范围感觉是NlogN的。。于是瞎想了一下就写了。。于是我就开始想线性的做法。
(我突然想起来ws_yzy大神跟我说这题的代码很短?)。
于是又想了一会QAQ。。
我们要求的是一个区间L,R中,三种字符的出现次数相等,那么似乎要维护前缀和的样子?
我们分别用三个变量cnt1,cnt2,cnt3表示这个区间内JOI出现的次数,转化为前缀和的形式:sum1[R]-sum1[L-1]==sum2[R]-sum2[L-1]==sum3[R]-sum3[L-1]。
似乎还是不可做啊卧槽。。。
咦如果是线性的话,R和L应该分开想啊。。于是移项:
sum1[R]-sum2[R]==sum1[L-1]-sum2[L-1],
sum2[R]-sum3[R]==sum2[L-1]-sum3[L-1]。
好像可做了?只要看看当前状态有没有之前对应的状态?
嗯。。果断想到map。。解决了。。QAQ。
#include<bits/stdc++.h>using namespace std;char s[200005];map <pair<int,int>,int> mp;int cnt1,cnt2,cnt3,n,ans;int main(){ scanf("%d",&n); scanf("%s",s+1); mp[make_pair(0,0)]=0; for (int i=1;i<=n;i++) { switch(s[i]) { case 'J': cnt1++; break; case 'O': cnt2++; break; case 'I': cnt3++; break; } if (mp.find(make_pair(cnt1-cnt2,cnt2-cnt3))==mp.end()) mp[make_pair(cnt1-cnt2,cnt2-cnt3)]=i; else ans=max(ans,i-mp[make_pair(cnt1-cnt2,cnt2-cnt3)]); } cout << ans;}
0 0
- 4236: JOIOJI 思路题 map
- bzoj 4236: JOIOJI map+乱搞
- bzoj 4236: JOIOJI(map+pair)
- 4236: JOIOJI
- [Hash] BZOJ 4236 JOIOJI
- bzoj 4236: JOIOJI
- BZOJ 4236 JOIOJI
- 【BZOJ】4236 JOIOJI
- BZOJ 4236 JOIOJI
- BZOJ 4236 JOIOJI
- BZOJ 4236: JOIOJI
- BZOJ 4236: JOIOJI
- BZOJ 4236 JOIOJI
- JOIOJI
- bzoj 4236: JOIOJI 排序&扫描
- BZOJ 4236 JOIOJI 排序+线扫
- [BZOJ4236] JOIOJI
- 【BZOJ4236】JOIOJI
- OMNeT++ ALOHA sample代码阅读
- Presorting
- 表示不同文件类型的魔术数字
- git 常用命令
- [我与电脑的不解之缘]和方正保护卡交手---经历九九八十一的难的我们
- 4236: JOIOJI 思路题 map
- Android Studio Gradle编译禁用Lint报错
- Android安装卸载探究
- 日志2016-1-12
- 文件后缀和相应的文件类型,打开方法参考大全
- java算法之三快速排序(交换排序)
- iOS 调用相册,拍照并上传图片详解
- STL算法库-数字运算(二)
- Android Studio——synchronized