けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 226 B - Counting Arrays (4Q, 灰色, 200 点)

連想配列の応用問題!

問題概要

 N 個の数列がある。

 i 番目の数列は、長さが  L_{i} であり、その  j 番目の要素は  a_{i, j} である。

2 つの数列  i, j は、 L_{i} = L_{j} であって、任意の  k = 1, 2, \dots, L_{i} に対して  a_{i, k} = a_{j, k} であるとき、等しいという。

 N 個の数列の種類数を答えよ。

制約

  •  1 \le N \le 2 \times 10^{5}
  •  L_{i} の総和は  2 \times 10^{5} 以下

考えたこと

問題文がいかめしくてビビるけど、実は単純なのだ。たとえば数列を C++ の vector<int> 型で表したとき、2 つの数列 P, Q が等しいかどうかは

P == Q

で判定できる!!

そして、数列の種類数は、set<vector<int>> 型変数 S を用意して、S に各数列を insert していけばよい。

最後に、S の要素数を返せば良い。

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    int N;
    cin >> N;

    set<vector<int>> S;
    for (int i = 0; i < N; ++i) {
        int L;
        cin >> L;
        vector<int> a(L);
        for (int j = 0; j < L; ++j) cin >> a[j];
        S.insert(a);
    }
    cout << S.size() << endl;
}