30pts玄关求调
查看原帖
30pts玄关求调
992367
liserver楼主2024/12/2 19:24

rt,

#include <bits/stdc++.h>

const int MAXN = 1e5 + 5;

int stra[MAXN], strb[MAXN];
int groupa[MAXN], groupb[MAXN];
int a0[MAXN], b0[MAXN];
int a1[MAXN], b1[MAXN];

void read_str(int str[], int len)
{
    for (int i = 0; i < len; i ++)
    {
        char ch;
        std::cin >> ch;

        str[i] = ch - '0';
    }
}

void read_group(int group[], int len)
{
    char last;
    std::cin >> last;

    int cnt = 0;

    for (int i = 1; i < len; i ++)
    {
        char ch;
        std::cin >> ch;

        if (ch != last)
        {
            cnt ++;
            last = ch;
        }

        group[i] = cnt;
    }
}

int main()
{
    // freopen("./edit2.in", "r", stdin);
    // freopen("./edit2.out", "w", stdout);

    int T;
    std::cin >> T;

    while (T --)
    {
        int n;
        std::cin >> n;

        read_str(stra, n), read_str(strb, n);
        read_group(groupa, n), read_group(groupb, n);

        memset(a0, 0, MAXN);
        memset(a1, 0, MAXN);

        memset(b0, 0, MAXN);
        memset(b1, 0, MAXN);

        for (int i = 0; i < n; i ++)
        {
            if (stra[i] == 0)
            {
                a0[groupa[i]] ++;
            }
            else
            {
                a1[groupa[i]] ++;
            }

            if (strb[i] == 0)
            {
                b0[groupb[i]] ++;
            }
            else
            {
                b1[groupb[i]] ++;
            }
        }

        int result = 0;

        for (int i = 0; i < n; i ++)
        {
            if ((a1[groupa[i]] > 0) && (b1[groupb[i]] > 0))
            {
                a1[groupa[i]] --;
                b1[groupb[i]] --;

                result ++;
            }
            else if ((a0[groupa[i]] > 0) && (b0[groupb[i]] > 0))
            {
                a0[groupa[i]] --;
                b0[groupb[i]] --;

                result ++;
            }
        }

        std::cout << result << "\n";
    }
}
2024/12/2 19:24
加载中...