专栏文章

题解:CF2029B Replacement

CF2029B题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mir16xhs
此快照首次捕获于
2025/12/04 14:04
3 个月前
此快照最后确认于
2025/12/04 14:04
3 个月前
查看原文

问题分析

给定一个二进制字符串 ss,在每一步中,我们需要找到一个相邻字符不同的位置 jj,然后将其替换为另一个字符串 rr 中的字符,并继续进行直到字符串只剩下一个字符。我们需要判断是否可以完成所有的操作。
目标: 判断能否按照规则成功完成所有的操作。如果无法进行操作,即 sk=sk+1s_k=s_{k+1} 对于所有的 kk,则游戏失败。

解题思路

对于每一步,我们需要尽可能选择一个相邻的不同字符对,并且确保替换后的结果能继续进行下去。
对于每一对相邻的不同字符,查看是否可以将其替换为 rir_i

Code

CPP
#include <bits/stdc++.h>
using namespace std;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
    int t;
    cin>>t;
    while (t--)
	{
	    int n;
		cin>>n;
		string s,r;
	    cin>>s;
        cin>>r;
        bool f=1;//表示是否可以完成操作
	    // 进行 n-1 次操作
	    for (int i=0;i<n-1;i++)
		{
	        bool ff=0;//是否找到可替换的字符对
	        for (int j=0;j<s.size()-1;j++)
			{
	            if (s[j]!=s[j+1])
				{
					//找到相邻不同的字符
	                s[j]=r[i];//将s[j]换为 r[i]
	                s.erase(j+1,1); //删除s[j+1]长度减1
	                ff=1;
	                break;//一旦找到替换对,退出当前循环
	            }
	        }
	        if (!ff)
			{
	            f=0;
	            break;
	        }
	    }
	    if (f)
	        cout<<"YES"<<endl;
	    else
	    	cout<<"NO"<<endl;
	}
    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...