E - Prefix Equality Editorial by hamamu


A,BA,B に使われている数値を、 AA での登場順に 0,1,2,0, 1, 2, \cdots となるよう、 数値を振り直します。 BB にしか登場しない数値は、 AA で使った数値より大きな数値を適当に振ります。

すると、 AA の各集合は、 種類数 kk の時 {0,1,,k1}\{0, 1, \cdots, k-1\} になります。 BB の各集合との一致を「種類数と最大値の一致」のみで判定可能になり、簡便です。

あらかじめ i=1,,Ni=1, \cdots, N に対し、

  • AA の先頭 ii 項による集合の種類数
  • BB の先頭 ii 項による集合の種類数と最大値

を求めておけば、各クエリに O(1)O(1) で答えられます。

計算量は、数値の振り直しや種類数のカウントにC++のmapやsetを使うと O(NlogN+Q)O(N\log N+Q) 、unordered_mapなどのハッシュを使うと O(N+Q)O(N+Q) です。

posted:
last update:



2025-04-11 (Fri)
11:19:10 +00:00