まずは操作が可逆かどうか考えてみる。操作1は逆操作が可能である:
- BB → AAB → AAAA → A
- AA → BAA → BBBB → B
操作2は、文字列が空でない限り逆操作が可能である:
- A → BB → AAB → ABBB
- A → BB → BAA → BBBA
- B → AA → BBA → BAAA
- B → AA → ABB → AAAB
したがって、文字列の集合はいくつかの同値類に分割できそうと思える。そこで、それらをもっとも短い文字列で代表させることを考える。
- AB → AAA → 空
- BA → BBB → 空
- AA → B
- BB → A
に従うと、長さ2以上の文字列は必ず短くできる。つまり、任意の文字列は、できるだけ短い文字列に変換するとA, B, 空のいずれかになり、文字列の集合が3つの同値類に分割できるとわかる。1
3つの同値類をそれぞれで表すことにして、文字をつなげる操作をで表すと、演算の性質は以下のようになっている。
これはと同型なので、で文字列との累積和を取っておけば、クエリにはで答えられる。2