题解:
考虑任意一个串都是两个前缀之差.
如果这个串要满足$num(J)=num(O)=num(I)$,那么两个前缀$num(J),num(O),num(I)$的相对大小关系必须是相同的.
我们对于每个前缀记下$num(J)-num(O),num(J)-num(I)$,然后利用map随便搞搞就行了.
代码:
#include<cstdio> #include<cstring> #include<cctype> #include<iostream> #include<algorithm> #include<map> using namespace std; typedef pair<int,int> pii; #define mp make_pair #define N 200010 char s[N]; map<pii,int>M; int main(){ int n; scanf("%d",&n); scanf("%s",s+1); M[mp(0,0)]=0; int J=0,O=0,I=0,ans=0; for(int i=1;i<=n;++i){ if(s[i]=='J') ++J; if(s[i]=='O') ++O; if(s[i]=='I') ++I; if(M.count(mp(J-O,J-I))) ans=max(ans,i-M[mp(J-O,J-I)]); else M[mp(J-O,J-I)]=i; } cout<<ans<<endl; return 0; }