题目链接:精选项目课程_IT热门课程_蓝桥云课课程 - 蓝桥云课
题目解析:看每个字符会在多少个字串中作出贡献即可,将其相加即可。
代码:
//#define local
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
typedef long long ll;
#define MAXN 100002
ll res=0;
int last[MAXN];
int next[MAXN];
int a[26];
int main(){
#ifdef local
freopen("data.in","rb",stdin);
//freopen("data.out","wb",stdout);
#endif
string str;
cin>>str;
int len=str.size();
//fill(last,last+len,-1);
//fill(next,next+len,len+1);
fill(a,a+26,-1);
for(int i=0;i<len;i++){
last[i]=a[str[i]-'a'];
a[str[i]-'a']=i;
}
fill(a,a+26,len);
for(int i=len-1;i>=0;i--){
next[i]=a[str[i]-'a'];
a[str[i]-'a']=i;
}
for(int i=0;i<len;i++){
res+=(ll)(i-last[i])*(next[i]-i);
}
cout<<res;
return 0;
}