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的主要内容,如果未能解决你的问题,请参考以下文章

LQ0095 不同子串set+substring

LQ0175 最大公共子串程序填空

LQ0084 回路计数DP

LQ0033 砝码称重DP

LQ0104 选数异或DP

LQ0072 数字三角形DP