列表

详情


NC220328. 子序列

描述

给出一个仅包含 a,b 的字符串 A。在 A 中间任意位置(包括开头结尾)插入一个字符,最大化 aab 作为子序列(可以不连续)在 A 中出现的次数。

输入描述

第一行一个仅包含 a,b 的字符串 A。

输出描述

输出一个整数,为插入一个字符后,aab 作为子序列在 A 中出现的次数的最大值。

示例1

输入:

abababa

输出:

10

说明:

在第一个字符后插入一个 a,变为 aabababa。

示例2

输入:

ababbaababa

输出:

33

示例3

输入:

aa

输出:

1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 117ms, 内存消耗: 22032K, 提交时间: 2023-04-01 16:14:19

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
ll acc(string s){
    ll ans=0;
    ll cnt_a=0;
    for(int i=0;i<s.size();i++){
        if(s[i]=='a') cnt_a++;
        else {
            ans+=(cnt_a)*(cnt_a-1)/2;
        }
    }
    return ans;
}
int main(){
    string s;
    cin>>s;
    cout<<max(acc('a'+s),acc(s+'b'))<<endl;
}
   

C++ 解法, 执行用时: 157ms, 内存消耗: 22040K, 提交时间: 2021-06-09 14:10:05

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
ll a[5];
string s;
ll check(string s)
{
	ll l=s.length(),ans=0;
	a[1]=0;
	for(ll i=0;i<l;++i)
	{
		if(s[i]=='b')
		ans+=a[1]*(a[1]-1)/2;
		else
		a[1]++;
	}
	return ans;
}
int main()
{
	cin>>s;
	cout<<max(check('a'+s),check(s+'b'));
	return 0;
}

Python3 解法, 执行用时: 1288ms, 内存消耗: 13652K, 提交时间: 2021-06-05 00:11:36

s = input()
ans1, ans2, cnt = 0, 0, 0
for i in s:
    if i == 'a':
        cnt += 1
    else:
        ans1 += cnt * (cnt-1) // 2
        ans2 += cnt * (cnt+1) // 2
print(max(ans2, ans1 + cnt * (cnt-1) // 2))

上一题