第十一届蓝桥杯大赛软件赛省赛C/C++ 大学 A 组 子串分值

题目描述

对于一个字符串 SS,我们定义 SS 的分值 f(S)f(S) 为 SS 中恰好出现一次的字符个数。例如 f(aba)=1,f(abc)=3,f(aaa)=0f(aba)=1,f(abc)=3,f(aaa)=0。

现在给定一个字符串 S0⋯n−1S0⋯n−1​(长度为 nn,1≤n≤1051≤n≤105),请你计算对于所有 SS 的非空子串 Si⋯j(0≤i≤j

输入描述

输入一行包含一个由小写字母组成的字符串 SS。

输出描述

输出一个整数表示答案。

#include 
using namespace std;

int main() {
    string s;
    cin >> s;
    int n = s.size();
    vector left(n), right(n);
    vector last_pos(26, -1);

    for (int i = 0; i < n; ++i) {
        int c = s[i] - 'a';
        left[i] = last_pos[c];
        last_pos[c] = i;
    }

    fill(last_pos.begin(), last_pos.end(), n);
    for (int i = n - 1; i >= 0; --i) {
        int c = s[i] - 'a';
        right[i] = last_pos[c];
        last_pos[c] = i;
    }

    long long res = 0;
    for (int i = 0; i < n; ++i) {
        res += (long long)(i - left[i]) * (right[i] - i);
    }

    cout << res << endl;
    return 0;
}

你可能感兴趣的:(蓝桥解析,算法,数据结构,c语言,c++,蓝桥杯)