C - Complementary XOR CodeForces - 1750C

以我的理解翻译一下:

给你两个长度为n的字符串a和b,均已01组成,我们的任务是通过选取l和r,a的[l,r]全部取反,b的[1,l-1]和[r+1,n]全部取反即(0变1,1变0)让ab均变成全部为0的字符串

                YES情况

1.一开始ab都是0

        输出0

2.ab相同

        我们通过顺序遍历a,遇见1就输出(i ,i)代表(l,r)

        通过实验当a中综述a中1的数量是奇数b最终变成111....

        我们需要再进行:

                (1,n)

                (1,1)

                (2,n)

        最终ab全部为0 

3.ab每一位均相反

        

        我们通过顺序遍历a,遇见1就输出(i ,i)代表(l,r)

        通过实验当a中综述a中1的数量是偶数b最终变成111....

        我们需要再进行:

                (1,n)

                (1,1)

                (2,n)

        最终ab全部为0  

                NO情况

4.其他情况

     

代码

#include<bits/stdc++.h>
#define ios ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define int long long
#define endl "\n"
#define yes cout<<"YES\n";
#define no cout<<"NO\n";
using namespace std;
const int M=1e6+10;

struct node{
    int l,r;
    int len;
};
int a[100];
void sol()
{
    int n; cin>>n;
    string sa; cin>>sa;
    string sb; cin>>sb;
    sa=" "+sa;  sb=" "+sb;
    int f=0;
    int allf=1; // 每一位都相反
    int allt=(sa==sb); // 每一位都相同
    int sasum1=0;
    for(int i=1;i<=n;i++)
    {
        if(sa[i]=='1') sasum1++;
        if(sa[i]==sb[i])
        {
            allf=0;
        }
    }

    if(allf || allt)
    {
        yes;
        if(allf)//全部相反
        {
            if(!(sasum1&1)) //偶数需要 (1 1)+(2 n)
            {
                cout<<sasum1+3<<endl; //次数
                for(int i=1;i<=n;i++)
                {
                    if(sa[i]=='1')
                    {
                        cout<<i<<" "<<i<<endl;
                    }
                }
                cout<<1<<" "<<n<<endl;
                cout<<1<<" "<<1<<endl;
                cout<<2<<" "<<n<<endl;
            }
            else
            {
                cout<<sasum1<<endl; //次数
                for(int i=1;i<=n;i++)
                {
                    if(sa[i]=='1')
                    {
                        cout<<i<<" "<<i<<endl;
                    }
                }
            }
        }
        else//全部相同
        {
            if(sasum1&1) //偶数需要 (1 1)+(2 n)
            {
                cout<<sasum1+3<<endl; //次数
                for(int i=1;i<=n;i++)
                {
                    if(sa[i]=='1')
                    {
                        cout<<i<<" "<<i<<endl;
                    }
                }
                cout<<1<<" "<<n<<endl;
                cout<<1<<" "<<1<<endl;
                cout<<2<<" "<<n<<endl;
            }
            else
            {
                cout<<sasum1<<endl; //次数
                for(int i=1;i<=n;i++)
                {
                    if(sa[i]=='1')
                    {
                        cout<<i<<" "<<i<<endl;
                    }
                }
            }
        }
    }
    else
    {
        no; return ;
    }
    return ;
}
signed main()
{
    ios;
    int t=1;
    cin>>t;
    while(t--) sol();
    return 0;
}


生活不可能像你想象得那么好,但也不会像你想象得那么糟。我觉得人的脆弱和坚强都超乎自己的想象。有时,我可能脆弱得一句话就泪流满面,有时,也发现自己咬着牙走了很长的路。

加油!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

活在当下 北乔

不爱多bb,朴实一句话:感谢您

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值