【 题目】
对于一个字符串 S,我们定义 S 的分值 f(S) 为 S 中出现的不同的字符个数。
例如 f(”aba”)=2,f(”abc”)=3,f(”aaa”)=1。 现在给定一个字符串 S[0…n−1](长度为 n),
请你计算对于所有 S 的非空 子串 S[i…j] (0≤i≤j<n),f(S[i…j]) 的和是多少。
【输入格式】
输入一行包含一个由小写字母组成的字符串 S
【输出格式】
输出一个整数表示答案。
【样例输入】
ababc
【样例输出】
28
【样例说明】
子串 f值
//第一组
a 1
ab 2
aba 2
abab 2
ababc 3
//第二组
b 1
ba 2
bab 2
babc 3
//第三组
a 1
ab 2
abc 3
//第四组
b 1
bc 2
//第五组
c 1
【标程】
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
char s[N];
int a[30];
long long int ans=0;
int main()
{
int i,j,n;
scanf("%s",s+1);
n=strlen(s+1);
for(i=1;i<=n;i++)
{
ans+=(i-a[s[i]-'a'])*(n-i+1);
a[s[i]-'a']=i;
}
cout<<ans;
}
【标程说明】
根据【样例说明】
第1位的a有1组,每组中有(n - 1 + 1)个a;
第2位的b有2组,每组中有(n - 2 + 1)个b;
所以第i位的那个字符有i组,每组中有(n - i + 1)个该字符;
第3位的a有3组,每组中有(n - 3 + 1) 个a,但是a已经出现过了,距离这个a最近的a在第1位(也就是第a[s[i]-‘a’] 位),所以减去第1组的 (n - 3 + 1)个a 并更新a[s[i]-‘a’]