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;
}