牛客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;
}
posted @   脂环  阅读(121)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示
主题色彩