SCUT - 12 - Western countries - Matrix quick power

https://scut.online/p/12
can do with fast power matrix.

#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("\n");
        }
        printf("\n");
    }
};

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\n",'a'+i,'a'+j);
                    s[i]='a'+j;
                }
            }
        }
        for(int i=0;t[i]!='\0';i++){
            t[i]=s[t[i]-'a'];
        }
        puts(t);
    }
    return 0;
}

Guess you like

Origin www.cnblogs.com/Yinku/p/11024679.html