2872. 子串分值和——第十一届蓝桥杯省赛第二场C++B组
题解:
细心观察可以发现,对于字符串s, 每个s[i]对答案的贡献为,(i-pre[i])*(n-i+1) ,pre[i]表示,s[i]上一次出现的位置
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+9;
int pre[N];
int tmp[30];
char s[N];
int main()
{
for(int i=0; i<30; i++) tmp[i]=0;
// string s;
cin>>s+1;
int n=strlen(s+1);
for(int i=1; i<=n; i++)
{
int x=s[i]-'a';
pre[i]=tmp[x];
tmp[x]=i;
}
ll ans=0;
for(int i=1; i<=n; i++)
{
int l=i-pre[i];
int r=n-i+1;
// cout<<l<<" "<<r<<endl;
ans+=(ll)l*r;
}
cout<<ans<<endl;
return 0;
}