子串分值和

该博客主要讨论了一种字符串子串的处理问题,即计算字符串中所有非空子串的不同字符个数之和。通过给出的样例输入和输出,展示了如何计算每个字符在子串中出现的组合及数量,并给出了相应的C++代码实现,该代码利用字符出现的位置动态计算了子串的分值总和。
摘要由CSDN通过智能技术生成

【 题目】

对于一个字符串 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’]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值