牛客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;
}
原文地址:https://www.cnblogs.com/lipoicyclic/p/14851433.html