2024(AtCoder Beginner Contest 375)
D - ABA
题目链接:https://atcoder.jp/contests/abc375/tasks/abc375_d


题目大意:给你一个仅由大写字母组成的字符串 S 让我们从中选出三个字符(大写字母),这三个字符满足 1 ≤ i < j < k ≤ ∣S∣ 且依次连接后该字符串是一个回文字符串。求有多少种选法?
input:
ABCACC
output:
5
满足条件的有 (1 , 2 , 4 ) , ( 1 , 3 , 4 ) , ( 3 , 4 , 5 ) , ( 3 , 4 , 6 ) , ( 3 , 5 , 6 ) 共计五种。
分析:
- 因为仅由三个字符组成回文串,所以我们只需要判断其 首、尾是否一样( Si = Sk ),那么在 ( i ) 和 ( k ) 之间的任何位置 ( j ) 也可以被选择,这意味着在 ( i ) 和 ( k ) 之间有 ( k - i - 1 ) 个可能的选择。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
string s;
cin >> s;
vector<ll> cnt(27), sum(27); // cnt 用于记录每个字符的出现次数,sum 用于记录每个字符的索引和
ll ans = 0;
int n = s.size();
// 遍历字符串中的每个字符
for (ll i = 0; i < n; i++){
int z = s[i] - 'A' + 1; // 将字母转换为对应的1~26
// 计算i之前的回文数的数量
ans += (i - 1) * cnt[z] - sum[z];
// 更新当前字符的出现次数和索引和
cnt[z]++;
sum[z] += i;
}
cout << ans << '\n';
return 0;
}
(i - 1) * cnt[z]是因为当前字符之前有cnt[v]个相同字符。

浙公网安备 33010602011771号