CF1697C awoo‘s Favorite Problem 思维

文章讨论了一个字符串处理问题,给定两个仅包含a,b,c的字符串s和t,可以通过在s中替换ab为ba和bc为cb的操作,判断是否能将s转换成t。关键在于比较字符串中a和c的顺序和数量。代码实现中,首先移除b并排序a和c,然后比较它们在s和t中的相对位置来确定答案。
摘要由CSDN通过智能技术生成

CF1697C awoo’s Favorite Problem

题意:

给出两个字符串s和t,这两个串中只有字母a、b、c。现在可以在s串中执行以下两种操作:

  • 选择s串中的ab将其替换为ba
  • 选择s串中的bc将其替换为cb

问通过这两种操作最终能否使字符串s成为t

思路:

因为s串中的操作ab可以变为ba,所以发现a是能通过b向后移动的。同理bc可以变为cb,所以c是可以通过b向前移动的。同时因为ac之间没有操作,所以ac在字符串s中的前后顺序不会改变,所以首先将s串中的a和c取出来和t串中a和c的先后顺序和个数进行比较,若顺序和个数相同,则再在s串中的a和t串中的相同a的位置进行比较,因为s串的a可以从前面向后面移动,所以s串中的a可以在t串的前面,同理s串中的c可以在t串的后面

代码:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
#include <map>
#include <functional>
#include <set>
#include <vector>
#define int long long
#define MAXN 2000
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
using namespace std;

signed main() {
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int t;
	string s1, s2;
	cin >> t;
	while (t--) {
		vector<pair<char, int>> vec1, vec2;//进行排序
		string ss1, ss2;//判断两串删除b后是否相等
		int n;
		cin >> n;
		cin >> s1 >> s2;
		for (int i = 0; i < s1.length(); ++i) {
			if (s1[i] != 'b') {
				ss1.push_back(s1[i]);
				vec1.push_back(make_pair(s1[i], i));
			}
		}
		for (int i = 0; i < s2.length(); ++i) {
			if (s2[i] != 'b') {
				ss2.push_back(s2[i]);
				vec2.push_back(make_pair(s2[i], i));
			}
		}
		bool ff = 0;
		if (ss1==ss2) {
			//排序后依次查找s串和t串中相同字母的位置
			sort(vec1.begin(), vec1.end());
			sort(vec2.begin(), vec2.end());
			for (int i = 0;i<ss1.length();++i) {
				if (vec1[i].first=='a'&&vec2[i].first=='a') {
					if (vec1[i].second > vec2[i].second) {
						ff = 1;
						break;
					}
				}
				else if (vec1[i].first == 'c' && vec2[i].first == 'c') {
					if (vec1[i].second < vec2[i].second) {
						ff = 1;
						break;
					}
				}
			}
			if (ff==0) {
				cout << "YES" << endl;
			}
			else {
				cout << "NO" << endl;
			}
		}
		else {
			cout << "NO" << endl;
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值