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 2 3
| 1234123*234*345+3245*145+324*45*345 [............] fix i->
|
那我们得到的是 [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 2 3 4 5 6
| 1234123*234*345+3245*145+324*45*345 i [base ] xxxxxx prodbase xx cur xxxxxxxxx prodres
|
ans = base + prodres
prodres = prodbase * cur
, 而新的转移 发现cur不需要了
那么 遇到数字时,
1 2 3 4 5 6
| sumall base prodres prodbase 1 sumall 1 base 1 1 prodres 10 10 prodbase int(char) int(char) 1 1 1
|
那么 遇到+时,
1 2 3 4 5 6
| sumall base prodres prodbase 1 sumall 1 base 1 prodres 1 prodbase 1 1 1
|
那么 遇到*
时,
1 2 3 4 5 6
| sumall base prodres prodbase 1 sumall 1 base 1 prodres 1 prodbase 1 1
|
所以,后缀矩阵乘法就秒了
前置的是[0,0,0,1,1]