• 模板


    写了一个矩阵类,不用到处抄。默认是int矩阵。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    
    const int MAXN=26;
    struct Matrix {
        int m[MAXN][MAXN];
        Matrix() {}
        void clear() {
            memset(m,0,sizeof(m));
        }
    
        void init(int m[MAXN][MAXN]) {
            for(int i=0; i<MAXN; ++i) {
                for(int j=0; j<MAXN; ++j)
                    this->m[i][j]=m[i][j];
            }
        }
    
        Matrix operator+(Matrix ma) {
            Matrix res;
            res.clear();
            for(int i=0; i<MAXN; ++i) {
                for(int j=0; j<MAXN; ++j)
                    res.m[i][j]=m[i][j]+ma.m[i][j];
            }
            return res;
        }
    
        Matrix operator*(Matrix ma) {
            Matrix res;
            res.clear();
            for(int i=0; i<MAXN; ++i) {
                for(int j=0; j<MAXN; ++j)
                    for(int k=0; k<MAXN; ++k)
                        res.m[i][j]+=m[i][k]*ma.m[k][j];
            }
            return res;
        }
    
        Matrix qpow(ll n) {
            Matrix res;
            res.clear();
            for(int i=0; i<MAXN; ++i)
                res.m[i][i]=1;
            Matrix x=*this;
            for(;n;n>>=1){
                if(n&1)
                    res=res*x;
                x=x*x;
            }
            return res;
        }
    
        void show(){
            for(int i=0; i<MAXN; ++i) {
                for(int j=0; j<MAXN; ++j)
                    printf("%d",m[i][j]);
                printf("
    ");
            }
            printf("
    ");
        }
    };
    
    char s[27];
    char t[1001];
    
    int main() {
    #ifdef Yinku
        freopen("Yinku.in","r",stdin);
    #endif // Yinku
        ll n;
        while(~scanf("%lld",&n)) {
            scanf("%s%s",s,t);
            Matrix A;
            A.clear();
            for(int i=0;i<26;i++){
                A.m[i][s[i]-'a']=1;
            }
            Matrix An=A.qpow(n);
            for(int i=0;i<26;i++){
                for(int j=0;j<26;j++){
                    if(An.m[i][j]){
                        //printf("%c->%c
    ",'a'+i,'a'+j);
                        s[i]='a'+j;
                    }
                }
            }
            for(int i=0;t[i]!='';i++){
                t[i]=s[t[i]-'a'];
            }
            puts(t);
        }
        return 0;
    }
    
  • 相关阅读:
    解读MSP430F169的头文件们
    解决编辑安装falkon中碰到缺少ecm问题
    vim基础普及
    本科2020专业目录
    cp 文件复制命令
    mkdir rmdir
    whereis ,which 文件查找
    gitlab软件的安装与使用
    如何节省数据库的成本
    innodb_undo_tablespaces参数引发的启动报错
  • 原文地址:https://www.cnblogs.com/Yinku/p/11024654.html
Copyright © 2020-2023  润新知