0%

2025 ICPC Asia Manila Regional(2025 ICPC 亚洲 菲律宾 马尼拉)——I. Stone Steps(在解决样例中出现的问题的时候,处理问题的方式尽量的这个能够和原来的方式有所关联,或者说,样例中出现的问题是提示我们思路中的漏洞,我们最好进行重新推导)

题目大意

题目名称: Stone Steps

题目描述:
给定一个仅包含非零十进制数字的字符串 ss(长度 1s5×1051 \le |s| \le 5 \times 10^5)。

对于任意不包含数字 0 的正整数 nn,定义 H(n)H(n) 为将 nn 的所有数位按非降序(从小到大)重新排序后得到的新整数。例如:H(1971)=1179H(1971) = 1179H(3)=3H(3) = 3

你的任务是计算字符串 ss 的所有非空连续子串所代表的十进制整数的 HH 函数值之和。即对于所有满足 1ijs1 \le i \le j \le |s| 的子串 s[i...j]s[i...j],求出 H(s[i...j])H(s[i...j]) 并求和。最终的结果需要对 1000696967 取模后输出。

输入格式:
单行输入一个字符串 ss

输出格式:
输出一个整数,表示所有非空连续子串的 HH 函数值之和对 1000696967 取模的结果。

样例 1:

1
2
3
4
5
输入:
3141

输出:
1432

样例 1 解释:
ss3141 时,共有 10 个非空连续子串,计算过程如下:

  • s[1...1]s[1...1]3H(3)=3H(3) = 3

  • s[2...2]s[2...2]1H(1)=1H(1) = 1

  • s[3...3]s[3...3]4H(4)=4H(4) = 4

  • s[4...4]s[4...4]1H(1)=1H(1) = 1

  • s[1...2]s[1...2]31H(31)=13H(31) = 13

  • s[2...3]s[2...3]14H(14)=14H(14) = 14

  • s[3...4]s[3...4]41H(41)=14H(41) = 14

  • s[1...3]s[1...3]314H(314)=134H(314) = 134

  • s[2...4]s[2...4]141H(141)=114H(141) = 114

  • s[1...4]s[1...4]3141H(3141)=1134H(3141) = 1134

将其相加得:3+1+4+1+13+14+14+134+114+1134=14323 + 1 + 4 + 1 + 13 + 14 + 14 + 134 + 114 + 1134 = 1432

样例 2:

1
2
3
4
5
输入:
1

输出:
1

样例 3:

1
2
3
4
5
输入:
11234567891234567891

输出:
43138332

思路讲解

还是要使用拆分算贡献的思想。

我们还需要利用一个东西,就是数位,其实只有 9 个,所以我们不用想着一次遍历去解决,可以遍历 9 次。

不过,我认为最有用的,还是把这个所有的东西,贡献,全部写下来。然后看看有什么规律。全部都写下来以后,我们发现这个规律非常的简单。

image

然后就跟着上面的这个公式求就完了。

以样例一具体而言就是:

image

推这种式子就是要细心。

AC代码

AC

https://codeforces.com/gym/106262/submission/365694725

心路历程(WA,TLE,MLE……)

在处理 lans,也就是背后的时候,忘记处理了不含 i7 的情况,即什么都不含,只含 i5 的背后情况。

image