種類数に関する面白い問題!
問題概要
2 つの文字列 は、
である
を左右反転してできる文字列
について、
である
といういずれかの条件を満たすとき、似ているとみなす。
与えられた 個の文字列
について、似ている文字列は同一視することにすると、何種類の文字列があるか。
制約
- すべての文字列の長さの合計が
以下
考えたこと
2 つの文字列 が等しいという条件を、次のように言い換えよう! ここで、文字列
を左右反転して得られる文字列を
というようにダッシュをつけて表すことにする。
【文字列が等しい条件】
文字列 があるとする。
に対して、
とする
に対して、
とする
このとき、 が似ている必要十分条件は、
であることである。
たとえば、"dog" と "god" は次のようにして、似ていると判定される。
- f("dog") = "dog"
- f("god" ) = "dog"
であり、これらは一致するので、"dog" と "god" は似ている。
set で管理
このような条件の言い換えができれば、あとは簡単だ。文字列を管理する集合を用意して、集合に を挿入していき、集合のサイズを答えればよい。
コード
#include <bits/stdc++.h> using namespace std; int main() { int N; cin >> N; string S; set<string> se; for (int i = 0; i < N; i++) { cin >> S; auto T = S; reverse(T.begin(), T.end()); se.insert(min(S, T)); } cout << se.size() << endl; }