(nice!!!)(LeetCode 每日一题)3335. 字符串转换后的长度 I(矩阵快速幂优化dp)

题目:3335. 字符串转换后的长度 I

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
思路:题解参考它的进阶版:(nice!!!)(LeetCode ) 3337. 字符串转换后的长度 II (矩阵快速幂优化 DP)

只需修改nums
在这里插入图片描述

class Solution {

    static const int N=26;
    const int Mod=1000000007;

    void mull(int a[][N] ,int b[][N] ) {
        int t[N][N]={0};
        for(int i=0;i<N;i++){
            for(int j=0;j<N;j++){
                for(int k=0;k<N;k++){
                    t[i][j]=(t[i][j]+(long long)a[i][k]*b[k][j])%Mod;
                }
            }
        }
        memcpy(a,t,sizeof t);
    }

    void solve(int m[N][N] ,int n,int mt[N][N] ) {
        int t[N][N]={0};
        for(int i=0;i<N;i++){
            t[i][i]=1;
        }
        while(n){
            if(n&1){
                mull(t,m);
            }
            n>>=1;
            mull(m,m);
        }
        memcpy(mt,t,sizeof t);
    }

public:
    int lengthAfterTransformations(string s, int t) {
        int m[N][N]={0};
        for(int i=0;i<N-1;i++){
            m[i][i+1]=1;
        }
        m[N-1][0]=1,m[N-1][1]=1;
        int mt[N][N]={0};
        solve(m,t,mt);
        int ct[N]={0};
        for(auto x:s){
            ct[x-'a']++;
        }
        long long ans=0;
        for(int i=0;i<N;i++){
            long long t=0;
            for(int j=0;j<N;j++){
                t=(t+mt[i][j])%Mod;
            }
            ans=(ans+t*ct[i])%Mod;
        }
        return (int)ans;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值