算法竞赛备考冲刺必刷题(C++) | 洛谷 AT_abc379_e Sum of All Substrings

本文分享的必刷题目是从蓝桥云课洛谷AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。

欢迎大家订阅我的专栏:算法题解:C++与Python实现!

附上汇总贴:算法竞赛备考冲刺必刷题(C++) | 汇总


【题目来源】

洛谷:AT_abc379_e [ABC379E] Sum of All Substrings - 洛谷

【题目描述】

You are given a string S S S of length N N N consisting of digits from 1 through 9.
给定一个长度为 N N N 的字符串 S S S,其中每个字符都是 19 的数字。

For each pair of integers ( i , j ) ( 1 ≤ i ≤ j ≤ N ) (i,j) (1≤i≤j≤N) (i,j)(1ijN), define f ( i , j ) f(i,j) f(i,j) as the value obtained by interpreting the substring of S S S from the i i i-th through the j j j-th character as a decimal integer. Find ∑ i = 1 N ∑ j = i N f ( i , j ) \sum\limits_{i=1}^{N}\sum\limits_{j=i}^{N}f(i,j) i=1Nj=iNf(i,j).
对于所有整数对 ( i , j ) ( 1 ≤ i ≤ j ≤ N ) (i,j) (1≤i≤j≤N) (i,j)(1ijN),定义 f ( i , j ) f(i,j) f(i,j) 为将 S S S 中第 i i i 到第 j j j 个字符组成的子串解释为十进制整数时的数值。请计算 ∑ i = 1 N ∑ j = i N f ( i , j ) \sum\limits_{i=1}^{N}\sum\limits_{j=i}^{N}f(i,j) i=1Nj=iNf(i,j) 的值。

【输入】

The input is given from Standard Input in the following format:

N
S

【输出】

Print the answer.

【输入样例】

3
379

【输出样例】

514

【算法标签】

《洛谷 AT_abc379_e Sum of All Substrings》 #数学# #高精度# #差分#

【代码详解】

#include 
using namespace std;

#define int long long  // 定义int为long long类型
const int N = 200005;  // 定义最大数组长度

// 全局变量:
// str[N]: 存储输入的数字字符串
// n: 数字字符串长度
// a[N]: 用于计算和存储结果的数组
char str[N];
int n, a[N];

signed main()
{
    cin >> n;  // 输入数字字符串长度
    scanf("%s", str + 1);  // 输入数字字符串(从索引1开始存储)

    // 第一遍处理:计算每个位置对最终结果的贡献
    for (int i = 1; i <= n; i++)
    {
        // 将字符转换为数字并乘以位置权重(i)
        // 结果存入倒序位置(n-i)
        a[n - i] += i * (str[i] - '0');
    }

    // 第二遍处理:计算前缀和(从后往前累加)
    for (int i = n - 1; i >= 0; i--)
    {
        a[i] += a[i + 1];
    }

    // 第三遍处理:处理进位(从低位到高位)
    for (int i = 0; i <= n - 2; i++)
    {
        a[i + 1] += a[i] / 10;  // 进位到高位
        a[i] %= 10;             // 保留个位数
    }

    // 处理最高位的进位
    int len = n - 1;
    while (a[len] >= 10)
    {
        a[len + 1] += a[len] / 10;
        a[len] %= 10;
        len++;
    }

    // 输出结果(从最高位到最低位)
    for (int i = len; i >= 0; i--)
    {
        cout << a[i];
    }

    return 0;  // 程序正常结束
}

【运行结果】

3
379
514

你可能感兴趣的:(算法,c++,开发语言)