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;
}