zoukankan      html  css  js  c++  java
  • SCUT

    https://scut.online/p/12
    可以用矩阵快速幂来做。

    #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;
    }
    
  • 相关阅读:
    Android设备管理器
    Android中读取手机联系人
    PopupWindow
    Activity之间数据的传递
    wpa_supplicant
    nandflash之基本特性
    NAND NOR Flash 和MTD
    mtd-util
    linux 常用命令
    minizip -基于zlib开源代码库
  • 原文地址:https://www.cnblogs.com/Yinku/p/11024679.html
Copyright © 2011-2022 走看看