比赛 2025.1.14 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 编辑字符串 最终得分 100
用户昵称 123 运行时间 2.923 s
代码语言 C++ 内存使用 95.30 MiB
提交时间 2025-01-14 20:56:14
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=2000010;
int t,n,tot1=0,tot2=0,a1[N][5],a2[N][5],sd1[N],sd2[N];
char s1[N],s2[N],x1[N],x2[N];
void init()
{
    memset(a1,0,sizeof(a1));
    memset(a2,0,sizeof(a2));
    memset(sd1,0,sizeof(sd1));
    memset(sd2,0,sizeof(sd2));
    tot1=0,tot2=0;
}
int main() {
    freopen("edit.in","r",stdin);
    freopen("edit.out","w",stdout);
    cin>>t;
    while (t--)
    {
        init();
        scanf("%d",&n);
        scanf("%s%s%s%s",s1,s2,x1,x2);
        for (int i=0;i<n;i++)
        {
            if (x1[i]!=x1[i-1])
            {
                tot1++;
            }
            sd1[i]=tot1;
            if (x1[i]=='1')
            {
                a1[tot1][s1[i]-'0']++;
            } 
            if (x2[i]!=x2[i-1])
            {
                tot2++;
            }
            sd2[i]=tot2;
            if (x2[i]=='1')
            {
               a2[tot2][s2[i]-'0']++;
            } 
        }
//        cout<<tot1<<" "<<tot2<<endl;
        int ret=0;
        for (int i=0;i<n;i++)
        {
            if (x1[i]==x2[i] && x1[i]=='0')
            {
                if (s1[i]==s2[i])
                {
                    ret++;
                }
            }
            else if (x1[i]!=x2[i])
            {
                if (x1[i]=='1' && a1[sd1[i]][s2[i]-'0'])
                {
                    a1[sd1[i]][s2[i]-'0']--;
                    ret++;
                }
                else if (a2[sd2[i]][s1[i]-'0'])
                {
                    a2[sd2[i]][s1[i]-'0']--;
                    ret++;
                } 
            }
        } 
        for (int i=0;i<n;i++)
        {
            if (x1[i]==x2[i] && x1[i]=='1')
            {
                if (a1[sd1[i]][0] && a2[sd2[i]][0])
                {
                    a1[sd1[i]][0]--;
                    a2[sd2[i]][0]--;
                    ret++;
                }
                else if (a1[sd1[i]][1] && a2[sd2[i]][1])
                {
                    a1[sd1[i]][1]--;
                    a2[sd2[i]][1]--;
                    ret++;
                }
            }
        }
        printf("%d\n",ret);
    }
}