mayoko’s diary

プロコンとかいろいろ。

Codeforces Round #313 (Div. 1) B. Equivalent Strings

Codeforces Round #313 (Div. 1)に参加しました。
AしかACせずお通夜でした。そろそろ感覚戻ってきたし良い結果も出したい…

解法

2つの文字列についてある意味「ソート」のようなことをして,それぞれが一致するかどうかを判定すれば良いことがわかります。

それを素直に実装すると下のコードのようになります。これは深さがlog nになるのでcreateにかかる計算時間はO(n \log n)です。

string A, B;
int n;

string create(string s) {
    int n = s.size();
    if (n % 2 == 1) return s;
    string a = create(s.substr(0, n/2));
    string b = create(s.substr(n/2, n/2));
    if (a > b) swap(a, b);
    return a+b;
}

int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    cin >> A;
    cin >> B;
    n = A.size();
    if (create(A) == create(B)) cout << "YES" << endl;
    else cout << "NO" << endl;
    return 0;
}