题解 [HNOI2008]GT考试

这篇博客是作者的第一篇题解,介绍了如何运用矩阵快速幂解决一个题目,该题目涉及到动态规划和自动机。作者指出,当看到题目中n和m的范围差距较大时,可以考虑使用矩阵快速幂方法。通过建立特殊形式的AC自动机,简化求解过程,避免使用KMP算法。博主分享了具体的代码实现,并提到矩阵乘法顺序可以根据个人喜好调整,整体时间复杂度为矩阵快速幂的标准复杂度。
摘要由CSDN通过智能技术生成

萌新第一篇题解 希望能有帮助 (本来打算交某谷的 但是写完发现题解已经满了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状态贡献的系数

复杂度:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值