LQ0071 子串分值和DP
Posted 海岛Blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LQ0071 子串分值和DP相关的知识,希望对你有一定的参考价值。
题目来源:
题目描述
对于一个字符串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 。
对于所有评测用例,1 ≤ n ≤ 100000。
输出格式
输出一个整数表示答案。
输入样例
ababc
输出样例
28
问题分析
(略)
AC的C语言程序如下:
/* LQ0071 子串分值和 */
#include <stdio.h>
#include <string.h>
#define N 100000
char s[N +2];
int dp[N +1];
int cnx[26];
int main()
memset(dp, 0, sizeof dp);
memset(cnx, 0, sizeof cnx);
scanf("%s", s + 1);
long long ans=0;
for (int i = 1; s[i]; i++)
dp[i] = dp[i - 1] + i - cnx[s[i] - 'a'];
ans += dp[i];
cnx[s[i] - 'a'] = i;
printf("%lld\\n", ans);
以上是关于LQ0071 子串分值和DP的主要内容,如果未能解决你的问题,请参考以下文章