b_lq_子串分值(记录当前字符的出现的前一个位置+组合数学)

S 的分值 f(S) 为 S 中恰好出现一次的字符个数。例如 f(aba) = 1
请你计算对于所有 S 的非空子串 S[i…j] (0≤i≤j<n),f(S[i…j]) 的和是多少。

思路
对于字符串中的一个字符c,他对分值的贡献的子串有:截止上一个相同字符的出现位置last_pos[c]到当前位置i,以及i到n-1这些字符串中的所有子串

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
    std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    string s; cin>>s;
    ll n=s.size(), ans=0, last[26]; memset(last,-1,sizeof last);
    for (int i=0; i<n; i++) {
        ans+=(i-last[s[i]-'a'])*(n-i);
        last[s[i]-'a']=i;
    }
    cout<<ans;
    return 0;
}
posted @ 2020-10-18 16:12  童年の波鞋  阅读(238)  评论(0编辑  收藏  举报