牛客IOI周赛26-普及组 B. 子序列(int128)
链接:https://ac.nowcoder.com/acm/contest/11233/B
来源:牛客网
题目描述
给出一个仅包含 a,b 的字符串 A。在 A 中间任意位置(包括开头结尾)插入一个字符,最大化 aab 作为子序列(可以不连续)在 A 中出现的次数。
输入描述:
第一行一个仅包含 a,b 的字符串 A。
输出描述:
输出一个整数,为插入一个字符后,aab 作为子序列在 A 中出现的次数的最大值。
示例1
输入
复制
abababa
输出
复制
10
说明
在第一个字符后插入一个 a,变为 aabababa。
示例2
输入
复制
ababbaababa
输出
复制
33
示例3
输入
复制
aa
输出
复制
1
实际上只可能把a加在头上或者把b加在末尾,取最大的即可。至于计算的方法是找到每个b然后算前面有多少个a,组合数搞一下即可。
写题解的目的是为了提醒一定要算一下数据范围,这个题最后一个点会爆long long,因此可以用int128乱搞,注意输出要写一个函数。
#include <bits/stdc++.h>
#define int __int128
using namespace std;
char s[6600005];
void print(__int128 x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>9)print(x/10);
putchar(x%10+'0');
}
signed main() {
scanf("%s", s);
int cnta = 0;
int ans1 = 0, ans2 = 0;
int sz = strlen(s);
for(int i = 0; i < sz; i++) {
if(s[i] == 'a') cnta++;
else {
ans1 += (cnta + 1) * cnta / 2;
ans2 += cnta * (cnta - 1) / 2;
}
}
ans2 += cnta * (cnta - 1) / 2;
if(ans1 > ans2) print(ans1);
else print(ans2);
return 0;
}