牛客IOI周赛26-普及组 B. 子序列(int128)

Posted 脂环

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客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;
}

以上是关于牛客IOI周赛26-普及组 B. 子序列(int128)的主要内容,如果未能解决你的问题,请参考以下文章

牛客IOI周赛26-普及组 最短路

牛客IOI周赛21-普及组 D.瞎位移群岛(bfs)

牛客IOI周赛27-普及组 D 旅游(简单floyd)

牛客IOI周赛26-提高组 A.逆序对(逆序对思维)

牛客IOI周赛27-提高组 C.马老师(容斥dp)

[牛客周赛]未曾设想的道路