题目

密码学

思路

模拟。因为给的加密操作是按顺序的,倒着进行解密就可以了。

Q: 怎么根据秘钥 以及 密文 得到原文。

A: ,那么

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#define MAXN 1001

inline void read(int &T) {
    int x=0;bool f=0;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=!f;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    T=f?-x:x;
}

int n,m,a[MAXN],b[MAXN],wtn[155];//wtn字母所对应的数字。
char ntw[155];
std::string sss[MAXN];

void Turn_ncphr(int x,int y) {
    //len1 --> key len2 --> m
    int len1=sss[x].length(),len2=sss[y].length();
    std::string emp="";
    for(int i=0,now=0;i<len2;++i,++now) {
        if(now>=len1) now=0;
        emp+=ntw[(wtn[sss[y][i]]+52-wtn[sss[x][now]])%52];
    }
    sss[y]=emp;
}

int main() {
    read(n),read(m);
    for(int i=1;i<=m;++i) read(a[i]),read(b[i]);
    for(int i=1;i<=n;++i) std::cin>>sss[i];
    for(int i='a',k=0;i<='z';++i) wtn[i]=k++,ntw[k-1]=char(i);
    for(int i='A',k=26;i<='Z';++i) wtn[i]=k++,ntw[k-1]=char(i);
    for(int i=m;i>=1;--i) Turn_ncphr(a[i],b[i]);
    for(int i=1;i<=n;++i) std::cout<<sss[i]<<'\n';
    return 0;
}