Submission

Status:

[-SSSSSSSSS]

Subtask/Task Score:

{0/100}

Score: 0

User: pxsit

Problemset: 04.Corretc the wodr

Language: cpp

Time: 0.002 second

Submitted On: 2025-06-01 11:05:15

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

int main() {
    cin.tie(0)->sync_with_stdio(0);
    int n;
    cin >> n;
    while (n--) {
        string s1, s2;
        cin >> s1 >> s2;
        if (s1.size() != s2.size()) {
            cout << "Cannot transform to " << s1 << '\n';
            continue;
        }
        vector<int> freq(256, 0);
        for (int i = 0; i < s1.size(); i++) {
            freq[(unsigned char)s1[i]]++;
            freq[(unsigned char)s2[i]]--;
        }
        bool ok = true;
        for (int c = 0; c < 256; c++) {
            if (freq[c] != 0) { ok = false; break; }
        }
        if (!ok) {
            cout << "Cannot transform to " << s1 << '\n';
            continue;
        }

        // --- NEW: build a permutation on mismatched indices and count cycles ---
        int L = s1.size();
        vector<vector<int>> want(256);
        vector<int> mismatch;
        for (int i = 0; i < L; i++) {
            if (s1[i] != s2[i]) {
                want[(unsigned char)s1[i]].push_back(i);
                mismatch.push_back(i);
            }
        }
        int M = mismatch.size();
        vector<int> to(L, -1);
        // assign each mismatch in s2 to a target in s1
        for (int i : mismatch) {
            int c = (unsigned char)s2[i];
            int j = want[c].back(); 
            want[c].pop_back();
            to[i] = j;
        }
        vector<bool> seen(L,false);
        int cycles = 0;
        for (int i : mismatch) {
            if (!seen[i]) {
                // walk this cycle
                int cur = i;
                do {
                    seen[cur] = true;
                    cur = to[cur];
                } while (!seen[cur]);
                cycles++;
            }
        }
        // each cycle of length ℓ uses ℓ–1 swaps
        cout << (M - cycles) << '\n';
    }
}