NC220328. 子序列
描述
输入描述
第一行一个仅包含 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))