Atcoder abc338
https://atcoder.jp/contests/abc338
G - evall
给定字符串S,由123456789+*
组成
最开始和最后的字符是数字,没有相邻的非数字
对于$(i\le j)$, 如果s[i],s[j]都是数字,则eval(i,j)为这一段字符串的表达式结果
否则 为0
求 $\displaystyle \sum_{i=1}^{|S|}\sum_{i=j}^{|S|} eval(i,j)\mod 998244353$
$|S| \le 10^6$
2s
1024mb
我的思路
这里虽然没有括号,但是有乘法的优先运算
如果固定前面
1 | 1234123*234*345+3245*145+324*45*345 |
那我们得到的是 [base + prodbase * (cur=34)]
每次遇到数字就是cur*=10,cur+=int(s[i])
而进入新的乘法则是prodbase*=cur, cur = 0
而进入新的加法则是base+=prodbase*cur
,prodbase=1,cur=0
这个方法的问题在于 如果想用矩阵表示,那么在做prodbase * cur
的时候 无法做这个乘法
再增加prodres
东西
1 | 1234123*234*345+3245*145+324*45*345 |
ans = base + prodres
prodres = prodbase * cur
, 而新的转移 发现cur不需要了
那么 遇到数字时,
1 | sumall base prodres prodbase 1 |
那么 遇到+时,
1 | sumall base prodres prodbase 1 |
那么 遇到*
时,
1 | sumall base prodres prodbase 1 |
所以,后缀矩阵乘法就秒了
前置的是[0,0,0,1,1]
代码
https://atcoder.jp/contests/abc338/submissions/50121997
1 |
|
总结
G: 没啥难度,想起来写起来都很顺