又找到一道水题,好开心
这题你就直接前缀和记录JOI分别出现的次数
然后把J的个数减去O的个数,O的个数减去I的个数
然后存到map里直接找一组相同的且相差最远的一组值即为答案
显然sumJ-sumO相等,那么这一段区间中sumJ-sumO==0同理sumO-sumI=0
那么sumJ==sumO==sumI
下面是代码(能过算我输)
#include<map>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,ans;
map<pair<int,int>,int> m;
char s[200200];
int sum[3][M];
int main(){
int i;
cin>>n;
scanf("%s",s+1);
m[make_pair(0,0)]=0;
for(i=1;i<=n;i++){
sum[0][i]=sum[0][i-1]+(s[i]=='J');
sum[1][i]=sum[1][i-1]+(s[i]=='O');
sum[2][i]=sum[2][i-1]+(s[i]=='I');
if(m.find(make_pair(sum[0][i]-sum[1][i],sum[1][i]-sum[2][i]) )==m.end()){
m[make_pair(sum[0][i]-sum[1][i],sum[1][i]-sum[2][i])]=i;
}else{
ans=max(ans,i-m[make_pair(sum[0][i]-sum[1][i],sum[1][i]-sum[2][i])]);
}
}
cout<<ans;
return 0;
}