版权声明:我这么弱的蒟蒻,虽然博文不是很好,但也请标明转发地址喵! https://blog.csdn.net/ACerAndAKer/article/details/82714203
STL大法好%%%po姐
存一个sum[i][0/1/2],表示前i位有多少个J/O/I然后做差丢进一个map里,记录最早出现时间,对每个位置在map里查一下
代码
//By AcerMo
#include<map>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int M=200500;
int n,ans;
char s[M];
int sum[M][3];
map<pair<int,int>,int>num;
int main()
{
cin>>n;
scanf("%s",s+1);
num[make_pair(0,0)]=0;
for(int i=1;i<=n;i++)
{
sum[i][0]=sum[i-1][0]+(s[i]=='J');
sum[i][1]=sum[i-1][1]+(s[i]=='O');
sum[i][2]=sum[i-1][2]+(s[i]=='I');
if (num.find(make_pair(sum[i][0]-sum[i][1],sum[i][1]-sum[i][2]))==num.end())
num[make_pair(sum[i][0]-sum[i][1],sum[i][1]-sum[i][2])]=i;
else ans=max(ans,i-num[make_pair(sum[i][0]-sum[i][1],sum[i][1]-sum[i][2])]);
}
cout<<ans<<endl;
return 0;
}