传送门:

  [1]:BZOJ

  [2]:洛谷

•题解

  定义数组 a,b,c 分别表示 'J' , 'O' , 'I' 的前缀和;

  要想使区间 (L,R] 满足条件当且仅当 a[R]-a[L] = b[R]-b[L] = c[R]-c[L];

  那么,由 a[R]-a[L] = b[R]-b[L] ⇔ a[R]-b[R] = a[L]-b[L];

  同理,由 b[R]-b[L] = c[R]-c[L] ⇔ b[R]-c[R] = b[L]-c[L];

  提前预处理出 a,b,c 数组后;

  对于 i 位置,查找之前是否含有满足 ai-bi = aj-bj && bi-ci = bj-cj 的位置 j,并且 j 尽可能的小;

  如何高效的查找呢?

  使用 map<pair<int ,int > , int >;

  对于之前处理过的位置 j ,将 aj-bj 和 bj-cj 存入到 pair<int ,int > 中,每次查找是否存在 (ai-bi,bi-ci) 即可;

  如果存在,求解当前答案,反之,将其加入到map中;

•Code

 #include<bits/stdc++.h>
using namespace std;
#define pii pair<int ,int >
const int maxn=2e5+; int n;
char s[maxn];
int a[maxn];
int b[maxn];
int c[maxn];
map<pii ,int >f; int Solve()
{
f.clear();
f[pii(,)]=;///将(0,0)加入到f中
a[]=b[]=c[]=; int len=strlen(s+);
for(int i=;i <= len;++i)
{
a[i]=a[i-]+(s[i] == 'J');
b[i]=b[i-]+(s[i] == 'O');
c[i]=c[i-]+(s[i] == 'I');
} int ans=;
for(int i=;i <= len;++i)
{
pii tmp=pii(a[i]-b[i],b[i]-c[i]);
if(f.count(tmp))
ans=max(ans,i-f[tmp]);
else
f[tmp]=i;
}
return ans;
}
int main()
{
scanf("%d",&n);
scanf("%s",s+); printf("%d\n",Solve()); return ;
}

最新文章

  1. 2.4G无线射频通信模块nRF24L01+开发笔记(基于MSP430RF6989与STM32f0308)(1.(2)有错误,详见更正)
  2. php-fpm 在centos 7下的安装配置
  3. spring mybatis memcached
  4. 深入理解CSS溢出overflow
  5. 如何使用coding.net
  6. 3D碰撞检测
  7. pace.js – 加载进度条插件
  8. 在PHPstorm编辑器中配置git环境
  9. C#泛型集合—Dictionary&lt;K,V&gt;使用技巧
  10. 使用jquery-mockjax模拟ajax请求做前台測试
  11. 分析JavaScript代码应该放在HTML代码哪个位置比较好
  12. 同一TextView上内容的不同显示
  13. 关于linux 原始套接字编程
  14. SEO-发信息注意的问题
  15. HTML文本
  16. c# 获取 com 引用真实组件地址
  17. docker-compose.yml(3)
  18. 【亲测】502 Bad Gateway 怎么解决?
  19. Dapper总结(一)---基本CRUD操作
  20. Android开发训练之第五章第七节——Transmitting Network Data Using Volley

热门文章

  1. 【水滴石穿】ReactNative-Redux-Thunk
  2. 【JZOJ4896】【NOIP2016提高A组集训第16场11.15】兔子
  3. 【JZOJ4742】【NOIP2016提高A组模拟9.2】单峰
  4. mysql自定义function 写递归查询子节点
  5. FastAdmin 自学教程 - 目录(持续更新)(2019-10-11)
  6. docker search
  7. KiCad EDA 画圆弧
  8. iOS 适配iPhoneX上tableHeaderView发生了高度拉伸、UI出现的空白间距
  9. php后端语言的基本语法
  10. UVa-10986_Sending email (向前星+Dijkstra)