Official

B - cat 2 Editorial by MMNMM


連想配列(平衡二分探索木やハッシュマップ)などを利用することで、重複した文字列を取り除くことができます。

for 文などを使って \((i,j)\) を列挙して、文字列 \(S _ i\) と \(S _ j\) を連結したものを連想配列に加えていくことでこの問題を解くことができます。

実装例は以下のようになります。

C++ での実装例

#include <iostream>
#include <vector>
#include <set>
using namespace std;

int main() {
    int N;
    cin >> N;
    vector<string> S(N);
    for (auto&& s : S)
        cin >> s;

    // 連結した文字列の重複を取り除くために std::set を使う
    set<string> ans;
    for (const auto& s : S)
        for (const auto& t : S)
            if (s != t) // 異なる 2 つの文字列を
                ans.emplace(s + t); // 連結して追加

    // set の大きさが答え
    cout << size(ans) << endl;
    return 0;
}

Python での実装例

N = int(input())

S = [input() for i in range(N)]

# 連結した文字列の重複を取り除くために set を使う
ans = set()
for s in S:
    for t in S:
        if s != t: # 異なる 2 つの文字列を
            ans.add(s + t) # 連結して追加

# set の大きさが答え
print(len(ans))

posted:
last update: