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

posted @ 2022-08-28 08:43  翔村亲亲鸟  阅读(21)  评论(0编辑  收藏  举报