竞赛讨论区 > D题 看数组的左边来计算,通过率75.49% 要崩溃了!!求大神援助!
头像
只做ABCDE
发布于 2025-03-13 00:36 四川
+ 关注

D题 看数组的左边来计算,通过率75.49% 要崩溃了!!求大神援助!

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

#define int long long

void __() {
    int n, m;
    cin >> n >> m;
    string a, b;
    cin >> a >> b;
    
    int freq_a[26] = {0};  
    int freq_b[26] = {0};  

    // 统计 a 和 b 的字符频率
    for (int i = 0; i < n; i++) freq_a[a[i] - 'a']++;
    for (int i = 0; i < m; i++) freq_b[b[i] - 'a']++;

    // 计算 a 和 b 直接匹配的字符数 k
    int k = 0;
    for (int i = 0; i < 26; i++) {
        int min_freq = min(freq_a[i], freq_b[i]);
        k += min_freq;
        freq_a[i] -= min_freq;
        freq_b[i] -= min_freq;
    }

    int mid = (n + m) / 2;  // 计算左半部分的长度

    if (n > m) {  
        // a 比 b 长,a 需要承担更多的修改
        int sum = mid - k, last = (n - mid);
        int ans1 = 0;
        for (int c = 0; c < 26; c++) ans1 += freq_a[c] / 2;
        sum -= min(ans1, last);
        cout << max(0LL, sum) << '\n';

    } else if (n < m) {  
        // b 比 a 长,b 需要承担更多的修改
        int sum = mid - k, last = (m - mid);
        int ans1 = 0;
        for (int c = 0; c < 26; c++) ans1 += freq_b[c] / 2;
        sum -= min(ans1, last);
        cout << max(0LL, sum) << '\n';

    } else {  
        // a 和 b 长度相同
        cout << (m - k) << '\n';
    }
}

signed main() {
    int T;
    cin >> T;
    while (T--) __();
}

全部评论

(0) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐