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;
}