[题解]luogu_AT1224_JOIOJI
https://www.cnblogs.com/fengzhiyuan/p/7588443.html
不会map,有点菜
1.要想知道三个字母出现次数相等, 为J [ i ]-J [ j ]== O[ i ]-O[ j ] == I [ i ]- I [ j ],移项得 J[ i ]-O[ i ]=J[ j ]-O[ j ] 其他同理
2.于是我们可以把每个 J[ i ]-O[ i ],O[ i ]-I[ i ]的二元组映射成出现这个组的位置,长度即为i-出现位置
至于为什么会想到哈希/map,还要问问dalao们才行
#include<iostream> #include<cstdio> #include<map> #define mp make_pair using namespace std; int n,ans; char s[200010]; int sum[3][200010];//出現次數和 map<pair<int,int>,int>m;//把出現次數差的二元組映射為出現位置處 int main() { scanf("%d",&n); scanf("%s",s+1); m[mp(0,0)]=0; for(int 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( mp(sum[0][i]-sum[1][i],sum[1][i]-sum[2][i]) ) == m.end())//如果map里沒有這個二元組 m[mp(sum[0][i]-sum[1][i],sum[1][i]-sum[2][i])]=i;//插入 else ans=max(ans,i-m[mp(sum[0][i]-sum[1][i],sum[1][i]-sum[2][i])]);//找到了更新ans,即為i-那次出現位置,也就是長度 } printf("%d\n",ans); }