bzoj4236JOIOJI

题意:

给一个只由JOI三个字母组成的串,求最长的一个子串使其中JOI三个字母出现次数相等。串长度≤200000

题解:

有点像bzoj4384,因此推算的过程是差不多的,但还是有不同因为本题要求的是出现次数相等,而那题要求的是不等:

cnt[1][i]-cnt[1][j]==cnt[2][i]-cnt[2][j],cnt[2][i]-cnt[2][j]==cnt[3][i]-cnt[3][j],cnt[1][i]-cnt[1][j]==cnt[3][i]-cnt[3][j]

化简得到cnt[1][i]-cnt[2][i]==cnt[1][j]-cnt[2][j],cnt[2][i]-cnt[3][i]==cnt[2][j]-cnt[3][j],cnt[1][i]-cnt[3][i]==cnt[1][j]-cnt[3][j](本式实际上是冗余的因为可由前两式相加得到)

故可以用一个map维护二元组<cnt[1][i]-cnt[2][i],cnt[2][i]-cnt[3][i]>的最早出现次数i,每次在map中查找键值中有没有和当前元素的<cnt[1]-cnt[2],cnt[2]-cnt[3]>相等的元素,有的话和答案比较,否则插入map。

代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <map>
  5. #define maxn 200100
  6. #define inc(i,j,k) for(int i=j;i<=k;i++)
  7. using namespace std;
  8.  
  9. int a,b,c,d,e,n,ans; char s[maxn];
  10. map<pair<int,int>,int>m;
  11. int main(){
  12. scanf("%d%s",&n,s+); m[make_pair(,)]=;
  13. inc(i,,n){
  14. if(s[i]=='J')a++; if(s[i]=='O')b++; if(s[i]=='I')c++; d=a-b; e=b-c;
  15. if(m.find(make_pair(d,e))==m.end())m[make_pair(d,e)]=i;
  16. else ans=max(ans,i-m[make_pair(d,e)]);
  17. }
  18. printf("%d",ans); return ;
  19. }

20160814

bzoj4236JOIOJI的更多相关文章

随机推荐

  1. 02.DRF-认识RESTful

    认识RESTful 在前后端分离的应用模式里,后端API接口如何定义? 例如对于后端数据库中保存了商品的信息,前端可能需要对商品数据进行增删改查,那相应的每个操作后端都需要提供一个API接口: POS ...

  2. Jenkins登录无效

    解决办法: 进入Jenkins安装目录: 1:进入D:\jenkins\users\admin 这个目录下找到config.xml  可以看到里面的用户名是admin 2:进入D:\jenkins\s ...

  3. windows下使用虚拟机安装linux操作系统

    前言:虚拟机是开发者的好帮手,它可以帮助我们在同一台电脑上创建不同的环境,这样你就可以在不影响原有的环境下,使用另外一套新的环境去完成你的开发工作.相信不少在windows下开发的同学对此深有体会,本 ...

  4. 循序渐进VUE+Element 前端应用开发(12)--- 整合ABP框架的前端登录处理

    VUE+Element 前端是一个纯粹的前端处理,前面介绍了很多都是Vue+Element开发的基础,从本章随笔开始,就需要进入深水区了,需要结合ABP框架使用(如果不知道,请自行补习一下我的随笔:A ...

  5. selenium自动化操作

    在前面爬虫的相关介绍中,我们介绍了如何抓取静态页面信息.但是,在实际的网页浏览过程中,我们可能会经常碰到各种需要进行交互的操作,典型的如输入信息.点击按钮之类. 对于这种场景,之前的静态页面操作方式已 ...

  6. 4、struct2的支持团队开发

    在一个大型的项目中,不同的人都开发不同的模块,不能所有的人都去操作同一个struct.xml文件,我们应该对于不同的模块对应不同的配置文件 列如我们对应的登陆模块,我们可以编写一个登陆的配置文件 1. ...

  7. Python3-subprocess模块-子进程管理

    简单介绍 subprocess模块可以创建新的进程,执行shell命令.Python脚本等 代码示例 import subprocess # 1.执行进程,并获取返回码 return_code = s ...

  8. Idea激活JRebel

    选择license激活 UUID 生成地址: http://www.uuid.online 激活地址 http://jrebel-license.jiweichengzhu.com/ UUID

  9. jmeter使用小结(一)

    jmeter是用来做接口压力测试的工具.这里只是简单介绍一下使用,大家可以自行查看帮助文档, 1.打开jmeter工具,创建线程组任务 2.添加配置元件,根据需要选择设置 3.添加采样器,这里是htt ...

  10. Riccati方程迭代法求解

    根据上述迭代法求解P,P为Riccati方程的解,然而用LQR需要计算K,再将K算出. (迭代过程中 ,我们可以将此算法和dlqr函数求解的参数进行对比,当误差小于我们设置的允许误差我们就可以把此算法 ...