#712 B (字符串思维 C (字符串构造 D (交互网格染色

博客内容涉及位操作的题目解析,包括翻转位操作和平衡位操作。B.FliptheBits通过翻转字符串中特定子串实现与目标串匹配;C.BalancetheBits则需要调整字符串中0和1的数量达到平衡;D.3-Coloring问题讨论了如何在限制条件下为坐标染色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

B. Flip the Bits
分析a串:从头开始遍历,每出现一段连续的01相等的子串,那么这一段子串就可以进行翻转操作,然后和b串对应的位置相比较,要么完全相反,要么完全相等。但是这每一段子串需要从头开始连着,不能间断。
最后可能会剩下一段,我们用一个while来剪掉最后相等的部分,因为没必要进行这部分的判断。

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

void work()
{
	string a, b;int n;
	cin >> n >> a >> b;
	int sum0 = 0, sum1 = 0, ok = 1;
	while(a[n-1] == b[n-1] && n > 0) --n;
	int pre = 0;
	for(int i = 0; i < n; ++i)
	{
		if(a[i] == '1')	{ ++sum1;if(b[i]=='0') ok = 0;
		}
		else {
			++sum0;if(b[i] =='1') ok = 0;
		}
		if(sum1 == sum0)
		{
			int x1 = 1, x2 = 1;// x1维护全部相等  x2维护全部相反 
			for(int j = pre; j <= i; ++j)
			{
				if(a[j] != b[j]) x1 = 0;
				if(a[j] == b[j]) x2 = 0;
			}
			// ok = 0 意味着这段子串需要全部相反 
			if(x2) ok = 1;// 全部相反就继续进行判断 
			if(!ok){
				cout << "NO\n"; return;
			}
			pre = i + 1;
		} 
	}
	if(ok) cout << "YES\n";
	else cout << "NO\n";
}

int main()
{
	int T; cin >> T;
	while(T--) work();
	return 0;
}
/*
1
6
011011
010100
*/

C. Balance the Bits
大佬题解

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 2e5 + 9;
int n;
char s[N];
char ans[N];
void work()
{
    cin >> n;
    cin >> s + 1;
    bool flag = true;
    int cnt = 0;
    if(s[1] != '1' || s[n] != '1') flag = false;
    for(int i = 2 ; i < n ; i ++)
        if(s[i] == '0') cnt ++;

    if(cnt & 1) flag = false;
    if(!flag) cout << "NO\n";
    else
    {
        cout << "YES\n";
        int l = 1, r = n;
        while(l < r)
        {
            while(s[l] != '1') l ++;
            while(s[r] != '1') r --;
            if(l >= r) break;
            ans[l ++] = '(', ans[r --] = ')';
        }
        int cnt = 0;
        for(int i = 1 ; i <= n ; i ++)
            if(s[i] == '0')
            {
                cnt ++;
                if(cnt & 1) ans[i] = '(';
                else ans[i] = ')';
            }
        for(int i = 1 ; i <= n ; i ++)	cout << ans[i];
        cout << "\n";

        cnt = 0;
        for(int i = 1 ; i <= n ; i ++)
            if(s[i] == '0')
            {
                cnt ++;
                if(cnt & 1) ans[i] = ')';
                else ans[i] = '(';
            }
        for(int i = 1 ; i <= n ; i ++)	cout << ans[i];
        cout << "\n";
    }
}

int main()
{
    int T; cin >> T;
    while(T--)
    work();
    return 0;
}

D. 3-Coloring
先把奇数坐标和偶数坐标存起来,所以的奇数坐标不可能相邻,所以的偶数坐标也不可能相邻。
显然每次只能禁一个,只要没禁1,就用1构造,如果禁1就用2构造。
当奇数被用完,优先用2构造,如果2被禁就用3构造。
当偶数被用完,优先用1构造,如果1被禁就用3构造。
显然用3构造的时候它只能被用于一种类型的坐标上,也不会发生冲突

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

void work()
{
	vector<pair<int,int> > od, ev;
	int n, x;
	scanf("%d", &n);
	for(int i = 1 ; i <= n ; i ++)
		for(int j = 1 ; j <= n ; j ++)
		{
			if((i + j) & 1) od.push_back({i, j});
			else ev.push_back({i, j});
		}
	int l = 0, r = 0;
	for(int i = 0 ; i < n * n ; i ++)
	{
		cin >> x;
		if(x != 1 && l < od.size())	
		{
			cout << 1 << " " << od[l].first << " " << od[l].second << endl;
			fflush(stdout);
			l ++;
		}
		else if(x != 2 && r < ev.size())	
		{
			cout << 2 << " " << ev[r].first << " " << ev[r].second << endl;
			fflush(stdout);
			r ++;				
		}
		else
		{
			if(l < od.size())
			{
				cout << 3 << " " << od[l].first << " " << od[l].second << endl;
				fflush(stdout);
				l ++;				
			 } 
			 else
			 {
				cout << 3 << " " << ev[r].first << " " << ev[r].second << endl;
				fflush(stdout);
				r ++;			 	
			 }
		}
	}

}

int main()
{
		work();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值