Problem - C - Codeforces
不,不是“随机”数字。
Ranom 数字由大写拉丁字母 A 到 E 表示。此外,字母 A 的值为 1,B 为 10,C 为 100,D 为 1000,E 为 10000。
一个 Ranom 数字是一个 Ranom 数字序列。这个 Ranom 数字的值计算如下:所有数字的值相加,但有些数字带有负号:如果右边(不一定是紧接着它)有严格更大的数字,则这个数字带有负号;否则,这个数字带有正号。
例如,Ranom 数字 DAAABDCA 的值为 1000−1−1−1−10+1000+100+1=2088。
现在给你一个 Ranom 数字,你可以更改其中不超过一个数字。请计算更改后可能的最大值。 输入格式
第一行包含一个整数 t (1≤t≤104) —— 测试数据组数。
每组测试数据仅包含一行字符串 s (1≤|s|≤2⋅105),由大写拉丁字母 A 到 E 组成,表示给定的 Ranom 数字。
所有测试数据的字符串长度和不超过 2⋅105。 输出格式
对于每组测试数据,输出一个整数,表示如果你最多只能更改一个数字,更改后可能得到的最大值。
Example
Input
Copy
4
DAAABDCA
AB
ABCDEEDCBA
DDDDAAADDABECD
Output
Copy
11088 10010 31000 15886
在第一个例子中,您可以得到 EAAABDCA,其价值为10000−1−1−1−10+1000+100+1=11088。
在第二个例子中,您可以得到 EB,其价值为10000+10=10010。
题解:
主要的思想就是枚举每一个位置看这个位置,被修改各个情况后,取最大值
乍一看,这样直接些没什么问题,
我原本的思路,修改位置后面的可以通过后缀记录
前面的只要记录各种字母出现多少个即可
但是这样会出现一种问题:
AABC
假设我们把C修改为A,前面两个A都加?
不是的,因为中间还有一个B,所以还是要减
因此我们需要用前缀统计前面的
用t进行记录,
1.每次前面的数会出现一定会被减,
2.或者会根据我们修改位置的数进行加减
举个例子ABCD...?(?是要修改的位置)
可以看出A一定会被减,和我们修改的位置无关,所以这种要统计出来,并清空,
还有这种DCBA...?
我们也不清楚会不会被减,要根据我们修改的位置加减
#include <cstdio>
#include <cstring>
#include <algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
#define int long long
typedef pair<int,int> PII;
typedef unsigned long long ULL;
const int N = 3e5 + 10;
int mod = 1e9 + 7;
int a[6];
int ma[N];
int b[N];
void solve()
{
string s;
cin >> s;
int n = s.size();
s = " " + s;
int mx = 0;
map<int,int> f;
f[1] = 1;
f[2] = 10;
f[3] = 100;
f[4] = 1000;
f[5] = 10000;
int ans = 0;
memset(a,0,sizeof a);
memset(ma,0,sizeof ma);
memset(b,0,sizeof b);
for(int i = n; i >= 1;i--)
{
int now = f[s[i] - 'A' + 1];
b[i] = ans;
ma[i] = mx;
if(s[i] - 'A' + 1 < mx)
{
ans -= now;
}
else
{
ans += now;
}
mx = max(mx,(int)s[i] - 'A' + 1);
}
int t = 0;
// cout <<ans <<"\n";
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= 5;j++)
{
int now = b[i] + t;
if(j < ma[i])
{
now -= f[j];
}
else
{
now += f[j];
}
int p = max(j,ma[i]);
for(int k = 1;k <= 5;k++)
{
if(k < p)
now -= f[k]*a[k];
else
now += f[k]*a[k];
}
ans = max(ans,now);
}
for(int j = 1;j < s[i] - 'A' + 1;j++)
{
t -= a[j]*f[j];
a[j] = 0;
}
a[s[i] - 'A' + 1] ++;
}
cout << ans <<"\n";
}
signed main()
{
ios::sync_with_stdio(0 );
cin.tie(0);cout.tie(0);
int t = 1;
cin >> t;
while(t--)
{
solve();
}
}