萌新第一篇题解 希望能有帮助 (本来打算交某谷的 但是写完发现题解已经满了qwq)
首先看到n和m范围巨大的差距就要想到矩阵快速幂
转移方式为直接在自动机上dp
和其他题解一样 这里设g[i][j]表示最长匹配到第i个数字 连接上数字j后的状态
~~蒟蒻语文不好 看不明白可以参考其他题解~~
蒟蒻看到各位大佬求g用的都是kmp 这里提出一种不一样的求法
我们发现g[i][j]的定义和AC自动机的tr[i][j]定义非常像
实际上 g[i][j] 就是一个只有一条链的AC自动机
于是我们可以用建AC自动机的方法求g
当然我们不需要真的建一颗tire出来
直接令第i个数字为第i个状态 令g[i][num[i+1]]=i+1
(num[1-m]为数字串) 然后直接建自动机即可(个人感觉比kmp方便很多)
具体代码:
for(int i=0;i<m;i++)g[i][num[i+1]]=i+1;
for(int i=1;i<=m;i++)for(int j=0;j<10;j++)
if(g[i][j])fail[g[i][j]]=g[fail[i]][j];
else g[i][j]=g[fail[i]][j];
之后矩阵加速dp即可
关于的矩阵乘法顺序 这里和大多数题解不太一样 看个人喜好
在该顺序下转移矩阵的i,j项表示i状态对j状态贡献的系数
复杂度: