1328C. Ternary XOR

链接:

https://codeforces.com/problemset/problem/1328/C

题意

多组案例,给你一个首位是2,其他位由0,1,2组成的数x,长度为n,存在一种特殊的运算⊙,若c = a⊙b,则ci = (ai + bi) % 3(a,b长度都等于n),比如:10222⊙11021=21210;现需根据给出的x,找到合适的a和b,并且为a和b相差最少的一对
1 ≤ n ≤ 5e4
∑n ≤ 5e4

Example

input
4
5
22222
5
21211
1
2
9
220222021
output
11111
11111
11000
10211
1
1
110111011
110111010

解析

思路就是数字只有0,1,2三种情况,寻找第一次1的位置,将其分为1和0,设分到1的为a,0的为b,现在a就是较大的那个数了,所以后面不管是什么数字,全部分给较小的b,让b尽可能地大,a后面全是0就可以了,因为a后面不管给1还是2,都会拉开a和b之间差距。

#include <iostream>
#include <string>
#include <cmath>

using namespace std;

int main()
{
	int _;
	cin >> _;
	
	while (_--)
	{
		int n;
		cin >> n;
		string x;
		cin >> x;

		string a = "1", b = "1";
		bool flag = false;

		for (int i = 1; i < n; i++)
		{
			if (x[i] == '1' && !flag)
			{
				a += "1";
				b += "0";
				flag = true;
			}
			else
			{
				if (flag)
				{
					a += "0";
					b += x[i];
				}
				else
				{
					char c = '0' + (x[i] - '0') / 2;
					a += c;
					b += c;
				}
			}
		}

		cout << a << endl << b << endl;
	}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值