区間 [0,i) (0-indexed) の A
, B
, C
の個数を、(逆元の存在する)何らかのデータ cnti として表すことを考えます。
「cnti=0⟺[0,i) に含まれる A
, B
, C
の個数が等しい」が成り立つように cnti を定めれば、
「cnti=cntj (i<j)⟺[i,j) に含まれる A
, B
, C
の個数が等しい」
が成り立ち、Zero-Sum Ranges の要領で条件を満たす部分文字列の個数を数えることが出来ます。
このような cnti の一例としては、[0,i) に含まれる A
, B
, C
の個数をそれぞれ ai,bi,ci として、
- (ai−bi, bi−ci) というペア
- ai+bi×106−ci×(106+1)
などが挙げられます。あとはこれを i=0,1,…,∣s∣ について計算し、cnti が同じものを2つ選ぶ場合の数を求めればよいです。
計算量は、連想配列を用いた場合 O(∣s∣ log∣s∣) または O(∣s∣) (ならし)となります。