Educational Codeforces Round 115
https://codeforces.com/contest/1598
G. The Sum of Good Numbers
十进制下没有0的是好数字
a = 好数字 数组
且其中 a[i]+a[i+1] == x 也是好数字
s = a的字符串拼接
问,输入s和x, 求a[i] 和 a[i+1] 在s中的位置
范围
|s| 5e5
|x| 2e5
2s
256mb
我的思路
两个数字加起来 = x
那么至少一个 >= x/2
所以有一个的长度 = |x| 或 |x-1|(这还需要x的首位是1)
那么可以枚举这个长度
问题变成s[j...j+len]
是一个数, 那么它的后临 或 前临 是否是 x-它
这样直接暴力肯定不行, 如何快速计算和比对?
直接数字化 然后 mod 不同的值来算hash?
长度 怎么参与考虑
有个严重的问题就是,做加法或者减法会有进位和借位,所以这似乎就跟字符串算法不太能联系起来了
没有特别想懂 这里没有0的意义, 没有0有什么特殊性质吗? , 27+67 = 94, 依然有进位
然后如果 x 是由两个len = |x|的加起来, 那么可以考虑hash一下所有长度|x|的, 再枚举连接处
x首位>1 则有一个和它首位 差不超过1,
始终感觉没有 把 相邻和求和之间建立任何联系
题解
一样的考虑大的长度
a+b =x, a>=b
|a| = |x|-1 或 |a|=|x|
if $|a| = |x|-1$ then $|b| = |x|-1$ ohhhhhhhhhhhhhhhhhhh !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
这就是我觉得应该有意义的0的意义,但是我自己没找出来的
因为如果 $|a| = |x|-1, |b| < |x|-1$
$a + b >= 1.1 * 10^t$ (没有0的作用
$a < 10^t$
$b < 10^{t-1}$
$a \ge 1.1 * 10^t - 10^{t-1}$
$a \ge 10^t$ 矛盾
if $|a| = |x|$, 考虑$a,x$的最长公共前缀$lcp(a,x)$, 同样的原理 因为不能出现0
$|b| = |x| - lcp(a,x)$ 或 $|b| = |x| - lcp(a,x) -1$
所以(a,b) 的位置只会有O(n) 种, 剩下就是多质数 hash
那这里lcp就直接无脑kmp就可以做
代码
https://codeforces.com/contest/1598/submission/193656762
题解里的质数wa 116了,我又加了个质数
1 |
|
总结
1h20min 内做了A~E, F做了1h有点久,没啥思路问题,都是编码bug
G. 现场似乎只有tourist和noimi出了这个题
没有智慧, 感觉要去找这个没有0的用途,但是没有找到, 应该找点小数据看看的,优雅的小数据打表应该就能发现了
对于加减的判断也是hash没问题, 还是在这里如何使用0去做长度推演上出了问题