题意:给的那个一个串,最多修改一次求最大价值,价值的计算为如果当前位置大于等于后面最大的字符,则为+,否则为-。数值为pow(10,s[i]-'A')。
思路:因为最多5种字符所以我们考虑每种字符修改时的操作,那么如果是变大,很容易发现,放的越前面越好,然后如果是变小那么放的越后面越好。所以每种字符的修改位置只有两个就是该字符第一次出现的和最后一次出现的位置。暴力即可。
/*keep on going and never give up*/
#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
#define int long long
typedef pair<int, int> pii;
#define lowbit(x) x&(-x)
#define endl '\n'
#define wk is zqx ta die
int a[200005];
int sum[200005];
int pow(int a, int b) {
int res = 1;
while (b) {
if (b & 1) {
res = res * a;
}
a = a * a;
b >>= 1;
}
return res;
}
int str(string s) {
int ans = 0;
char pre = 'A';
for (int i = s.size() - 1; i >= 0; i--) {
if (s[i] >= pre) {
ans += pow(10, s[i] - 'A');
} else {
ans -= pow(10, s[i] - 'A');
}
pre = max(pre, s[i]);
}
return ans;
}
signed main() {
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while (t--) {
string s;
cin >> s;
int n = s.size();
for (int i = 0; i < n; i++) {
a[i] = s[i] - 'A';
}
int ans = -1e9;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
string ss;
int ok = 0;
for (int l = 0; l < n; l++) {
if (a[l] == i && ok == 0) {
ss.push_back(j + 'A');
ok = 1;
} else {
ss.push_back(a[l] + 'A');
}
}
ans = max(ans, str(ss));
ss.clear();
ok = 0;
for (int l = 0; l < n; l++) {
if (a[l] == i) {
ok = l;
}
ss.push_back(a[l] + 'A');
}
ss[ok] = j + 'A';
ans = max(ans, str(ss));
}
}
cout << ans << endl;
}
return 0;
}