【BZOJ4236】JOIOJI

Description

JOIOJI桑是JOI君的叔叔。“JOIOJI”这个名字是由“J、O、I”三个字母各两个构成的。
最近,JOIOJI桑有了一个孩子。JOIOJI桑想让自己孩子的名字和自己一样由“J、O、I”三个字母构成,并且想让“J、O、I”三个字母的出现次数恰好相同。
JOIOJI桑家有一份祖传的卷轴,上面写着一首长诗,长度为N,由“J、O、I”三个字母组成。JOIOJIさん想用诗中最长的满足要求的连续子串作为孩子的名字。
现在JOIOJI桑将这首长诗交给了你,请你求出诗中最长的、包含同样数目的“J、O、I”三个字母的连续子串。

Input

第一行一个正整数N,代表这首长诗的长度
接下来一行一个长度为N的字符串S,表示这首长诗,保证每个字符都是“J、O、I”三个字母中的一个

Output

输出一行一个正整数,代表最长的包含等数量“J、O、I”三个字母的最长连续子串的长度。如果不存在这样的子串,输出0

Sample Input

10
JOIIJOJOOI

Sample Output

6

HINT

选择“IIJOJO”这个子串,长度为6,包含“J、O、I”三个字母各2个,这是最长的满足要求的子串。
1<=N<=2*10^5

题解:本题要求三个字符的数量都相同,我们仍然采用前缀相减的方式,设sj,so,si表示J,O,I的前缀出现次数,那么条件就是:

sj[i]-sj[j]=so[i]-so[j]=si[i]-si[j]

移项,得

sj[i]-so[i]=sj[j]-so[j],sj[i]-si[i]=si[i]-si[j]

这样就转变成让i和j的两个权值都相等的问题,用map存一下就好了

然而我一开始忘了map怎么用,手写treap水过~

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cstdlib>
using namespace std;
const int maxn=200010;
int rt[maxn<<1],ch[maxn][2],v[maxn],k[maxn],w[maxn];
int n,tot,s1,s2,s3,ans;
char str[maxn];
void rotate(int &x,int d)
{
int y=ch[x][d];
ch[x][d]=ch[y][d^1];
ch[y][d^1]=x;
x=y;
}
void insert(int &x,int y,int z)
{
if(!x)
{
x=++tot;
v[x]=y,w[x]=z,k[x]=rand();
return ;
}
int d=y<v[x]?0:1;
insert(ch[x][d],y,z);
if(k[ch[x][d]]>k[x]) rotate(x,d);
}
int find(int x,int y)
{
if(!x) return 0;
if(y==v[x]) return x;
if(y<v[x]) return find(ch[x][0],y);
return find(ch[x][1],y);
}
int main()
{
srand(2333333);
scanf("%d",&n);
scanf("%s",str);
int i;
insert(rt[n],0,0);
for(i=1;i<=n;i++)
{
if(str[i-1]=='J') s1++;
if(str[i-1]=='O') s2++;
if(str[i-1]=='I') s3++;
int t=find(rt[s1-s2+n],s2-s3);
if(!t) insert(rt[s1-s2+n],s2-s3,i);
else ans=max(ans,i-w[t]);
}
printf("%d",ans);
return 0;
}

【BZOJ4236】JOIOJI STL的更多相关文章

  1. 【BZOJ4236】JOIOJI [DP]

    JOIOJI Time Limit: 10 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description JOIOJI桑是JOI君的叔叔 ...

  2. 【bzoj4236】JOIOJI STL-map

    题目描述 JOIOJI桑是JOI君的叔叔.“JOIOJI”这个名字是由“J.O.I”三个字母各两个构成的. 最近,JOIOJI桑有了一个孩子.JOIOJI桑想让自己孩子的名字和自己一样由“J.O.I” ...

  3. 【Example】C++ STL 常用容器概述

    前排提醒: 由于 Microsoft Docs 全是机翻.所以本文表格是我人脑补翻+审校. 如果有纰漏.模糊及时评论反馈. 序列式容器 序列容器是指在逻辑上以线性排列方式存储给定类型元素的容器. 这些 ...

  4. 【转】C++ STL 相关的问题集合

    3.C++ STL中vector的相关问题:    (1).调用push_back时,其内部的内存分配是如何进行的?    (2).调用clear时,内部是如何具体实现的?若想将其内存释放,该如何操作 ...

  5. 【转】C++ STL快速入门

    转自:https://www.cnblogs.com/skyfsm/p/6934246.html 冠军的试炼 悟已往之不谏,知来者之可追 博客园 首页 新随笔 联系 订阅 管理 随笔 - 60  文章 ...

  6. 【C++】:STL迭代器使用---[容器::iterator iter;]

    参考文章:http://blog.csdn.net/qq_23100787/article/details/51388163 迭代器这种东西,就是为了使访问简单!! 容器::iterator iter ...

  7. 【经验】实现STL算法时遇到的模板编译错误问题

    在实现set_union算法时调用了自己写的copy算法,出现了以下问题. Error 1 error C2665: 'xyz_stl::__copy' : none of the 2 overloa ...

  8. 【C++】朝花夕拾——STL vector

    STL之vector篇 N久之前是拿C的数组实现过vector中的一些简单功能,什么深拷贝.增删查找之类的,以为vector的实现也就是这样了,现在想想真是...too young too naive ...

  9. 【转载】C++ STL priority_queue用法

    priority_queue 对于基本类型的使用方法相对简单.他的模板声明带有三个参数,priority_queue<Type, Container, Functional> Type 为 ...

随机推荐

  1. DevExpress gridcontrol学习知识点

    .//允许自动合并单元格gv1.OptionsView.AllowCellMerge = true; 设置某列不合并 选中该列,在OptionsColumns-->AllowMerge中设置为f ...

  2. Linux 克隆虚拟机引起的“Device eth0 does not seem to be present, delaying initialization”

    Linux 克隆虚拟机引起的“Device eth0 does not seem to be present, delaying initialization” 虚拟机Vmware上克隆了一个Red ...

  3. eclipse-设置默认编码格式为UTF-8

    需要设置的几处地方为: Window->Preferences->General ->Content Type->Text->JSP 最下面设置为UTF-8 Window ...

  4. 用isNaN函数来判断是否只能输入正负数字

    isNaN() 函数通常用于检测 parseFloat() 和 parseInt() 的结果, 以判断它们表示的是否是合法的数字.当然也可以用 isNaN() 函数来检测算数错误,比如用 0 作除数的 ...

  5. 【转】java基本数据类型vs封装数据类型

    1.基本概念 说java是面向对象的语言是正确的,但是她不纯,基本数据类型就不是对象. 基本数据类型可以大致分为三类:数据型:int.short.long.byte.float.double字符型:c ...

  6. thinkphp 前台测试

    配置文件 <?php return array( 'DB_TYPE' => 'mysql', // 数据库类型 'DB_HOST' => 'localhost', // 服务器地址 ...

  7. android 创建 xml文件

    android创建xml文件的方法. 要操作android的外部存储,所以要在AndroidManifest.xml文件中添加权限. <uses-permission android:name= ...

  8. C++ 类的头文件、实现、使用

    再次吐槽下C++Primer这本书,啰哩啰嗦,废话太多.如果我来翻译的话,绝对删减一堆没用的---仅限于发牢骚. 不知道是否经典的做法 类中的成员声明在头文件中,定义(我更喜欢叫实现)在源文件中,使用 ...

  9. 第三百二十节,Django框架,生成二维码

    第三百二十节,Django框架,生成二维码 用Python来生成二维码,需要qrcode模块,qrcode模块依赖Image 模块,所以首先安装这两个模块 生成二维码保存图片在本地 import qr ...

  10. 优矿众包对冲基金计划”优选策略---100w实盘资金管理权!!

    https://uqer.io/contest/ http://www.cnblogs.com/dunitian/p/4939369.html 优连