Run ID 作者 问题 语言 测评结果 时间 内存 代码长度 提交时间
91867 sh25_shenpy 完美的代价 C++ 通过 9 MS 276 KB 1901 2026-06-17 20:41:59

Tests(10/10):


#include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; int main() { // 优化IO ios::sync_with_stdio(false); cin.tie(NULL); int N; if (!(cin >> N)) return 0; string s; cin >> s; // 1. 判断是否可能构成回文 vector<int> count(26, 0); for (char c : s) { count[c - 'a']++; } int odd_count = 0; for (int cnt : count) { if (cnt % 2 != 0) { odd_count++; } } // 如果长度偶数,不能有奇数字符;长度奇数,只能有1个奇数字符 if ((N % 2 == 0 && odd_count > 0) || (N % 2 == 1 && odd_count > 1)) { cout << "Impossible" << endl; return 0; } // 2. 贪心模拟交换 long long ans = 0; int left = 0; int right = N - 1; // 使用可变字符串进行操作 // 注意:string 的 swap 或 erase 操作可能是 O(N),总复杂度 O(N^2) while (left < right) { // 从 right 向左找与 s[left] 相同的字符 int k = right; while (k > left && s[k] != s[left]) { k--; } if (k == left) { // 没找到匹配,说明 s[left] 是那个奇数字符 // 将其与下一个字符交换,相当于向中间移动一步 swap(s[left], s[left + 1]); ans++; // 不移动指针,继续为新的 s[left] 寻找匹配 } else { // 找到匹配 s[k],将其冒泡交换到 s[right] for (int j = k; j < right; ++j) { swap(s[j], s[j + 1]); ans++; } // 此时 s[right] 已与 s[left] 匹配 left++; right--; } } cout << ans << endl; return 0; }


测评信息: