JOIOJI
先頭 i 文字までで J, O, I が現れた回数をそれぞれ J[i], O[i], I[i] とする
s 文字目から t 文字目までの区間が条件を満たすのは
J[t] - J[s - 1] == O[t] - O[s - 1] == I[t] - I[s - 1] であるときだから
条件は
J[t] - O[t] = J[s - 1] - O[s - 1] かつ
O[t] - I[t] = O[s - 1] - I[s - 1]
と表せる
そこで JO[i] = J[i] - O[i], OI[i] = O[i] - I[i] とおくと
JO[i] == JO[j] かつ OI[i] == OI[j] となる i, j について abs(i - j) の max が答え (*)
これはたとえば JO[] の値ごとにその値をとる添字をまとめ
OI[] についてのそれと共通部分をとり、最大 - 最小をみればよい
C++ の set で intersection を使えばいいと思う