欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2020 CCPC Wannafly Winter Camp Day1 B 密码学( 模拟)

程序员文章站 2022-07-15 16:10:17
...

2020 CCPC Wannafly Winter Camp Day1 B 密码学( 模拟)
2020 CCPC Wannafly Winter Camp Day1 B 密码学( 模拟)
思路:模拟题,也没啥算法,老老实实逆着推就行了,只是一开始(x+y)%mod 52=t,要逆着推的话也就是已知x和t来求y,于是y=(52+t-x)%52,其他的就没啥难度了,看着很烦,做起来其实还行。

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
int n,m,a[maxn],l[maxn],r[maxn];
string s[maxn];
void init()//预处理
{
    for(int i=0,j='a';i<26;++i,++j) a[i]=j;
    for(int i=26,j='A';i<52;++i,++j) a[i]=j;
    for(int i='a',j=0;i<='z';++i,++j) a[i]=j;
    for(int i='A',j=26;i<='Z';++i,++j) a[i]=j;
}
int main()
{
    init();
    scanf("%d %d",&n,&m);
    for(int i=1;i<=m;++i)
    scanf("%d %d",&l[i],&r[i]);
    for(int i=1;i<=n;++i) cin>>s[i];
    for(int i=m;i>=1;--i)
    {
        string t1=s[l[i]],t2=s[r[i]];
        while(t1.size()<t2.size()) t1.append(t1);
        int len=t2.size();
        for(int i=0;i<len;++i)
        t2[i]=a[(52+a[t2[i]]-a[t1[i]])%52];
        s[r[i]]=t2;
    }
    for(int i=1;i<=n;++i) cout<<s[i]<<endl;
 }