JOIOJI

やばすぎる

atcoder.jp

解法(部分点)

とりあえずO(N^{2})でやりたい…
vint J,O,Iに累積和をとっていきます。
J_i=J_{i-1}+S_i=='J'?1:0といった感じですね
区間(t,s]のJの数はJ_s-J_tで求められるので
J_s-J_t=O_s-O_t=I_s-I_t
の箇所を求めてあげればよさそうです。
tとsを決めてあげてO(N^{2})でできました

解放(天才)

J_s-J_t=O_s-O_tの時に(t,s]のOとJの数が同じ…ふむ
J_s-O_s=J_t-O_tこうじゃな(天才)これで独立に考えることができるようになった
vint JO,JIを定義します
JO_i=J_i-O_i,JI_i=J_i-I_iという定義にします
この時、JO_s=JO_t,JI_s=JI_tの時、長さmax(s,t)-min(s,t)がJOIが同じ数含まれている。
s,tを決め打ちするとO(N^{2})になるので、天才になります
map<pint,vint>を定義してkeyは(JO_i,JI_i)です。

mp[hoge].push_back(i)

をすべてのiについて行います。
同じKeyということはJO_s=JO_t,JI_s=JI_tなのですべてのkeyのvalueをsortしてv[v.size()]-v[0]を行えば答えが出ます(すごい)。
累積和、最初に0をつけないとバグります(それはそう)