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] 个相同字符。

 

posted @ 2024-10-17 18:54  dittoo  阅读(56)  评论(0)    收藏  举报