目录
题面
题面意思大概是,给你一个字符串(包含‘A’‘B’‘C’),
如果你遇到“BB”,可以把它换成‘A’
如果你遇到‘A’,可以把它换成“BB”
你可以对以上操作做无限次
问你如何把他改成字典序最小的字符串.
题解
思考一下,你会发现:
1. 如果你遇到“BB”,可以把它换成第一个字符换成‘A’,把后面一个换成‘A’‘B’‘C’除外的字符.仔细思考,你会发现这对后面答案没有影响.
2. 如果你遇到“BA”,可以把它换成“AB”.
if (s[i] == 'B'){
if (s[i + 1] == 'B') cout << 'A',s[i + 1] = '_';
else if (s[i + 1] == 'A') cout << 'A',s[i + 1] = 'B';
else cout << s[i];
}
3. 遇到‘A’‘C’,直接输出.
4. 遇到你换出来的字符,跳过.
if (s[i] == 'C' || s[i] == 'A') cout << s[i];
if (s[i] == '_') continue;
以下代码,我就用‘_’代表换下来的字符:
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define M 1005
#define N 500005
#define debug(...) cout << '[' << 'D' << 'E' << ']' << __LINE__ << ':' << __VA_ARGS__ << endl;
#define v(x) #x << '(' << x << ')'
#define mod 998244353
#define Mod (int) 1e9 + 7
#define who(s,limit,tpe) s + tpe , s + limit + tpe
#define all(s) s.begin(),s.end()
#define s_(s) s.size()
int a[N];
string s;
int main(){
int n,m;
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> s;
for(int i = 0 ; i < n - 1 ; i ++) {
if (s[i] == 'C' || s[i] == 'A') cout << s[i];
if (s[i] == '_') continue;
if (s[i] == 'B'){
if (s[i + 1] == 'B') cout << 'A',s[i + 1] = '_';
else if (s[i + 1] == 'A') cout << 'A',s[i + 1] = 'B';
else cout << s[i];
}
}
if (s[n - 1] != '_') cout << s[n - 1] << endl ;
}