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;
 }
发布了39 篇原创文章 · 获赞 0 · 访问量 1069

猜你喜欢

转载自blog.csdn.net/qq_42479630/article/details/104072298