题解:P17359 [ECNA 2024] Leapfrog Encryption

· · 题解

按照题目意思模拟即可。

加密只需要按照题目意思模拟。代码如下。

int cnt=-1;
for(int i=0;i<=n;i++){
    int b;
    if(i<n)b=key[i]-'a'+2;
    else b=1;
    if(i%2){
        for(int x=m-1,k=0;x>=0;x--){
            if(ans[x]==0)k++;
            if(k == b)ans[x]=s[++cnt],k=0;
        }
    }
    else for(int x=0,k=0;x<m;x++){
        if(ans[x] == 0)k++;
        if(k == b)ans[x]=s[++cnt],k=0;
    }
}
cout<<ans;

而解密稍微复杂一些。需要对给的串扫一遍,有字符则计数器增加。当计数器到达对应的 key 值时,就往答案串后加入该字符,并将给的串对应位置变成 0

对应的代码段如下:

int cnt=-1;
for(int i=0;i<=n;i++){
    int b;
    if(i<n)b=key[i]-'a'+2;
    else b=1;
    if(i%2){
        for(int x=m-1,k=0;x>=0;x--){
            if(s[x]!=0)k++;
            if(k == b)ans[++cnt]=s[x],s[x]=0,k=0;
        }
    }
    else for(int x=0,k=0;x<m;x++){
        if(s[x]!=0)k++;
        if(k == b)ans[++cnt]=s[x],s[x]=0,k=0;
    }
}
cout<<ans;

:::success[code]

#include<bits/stdc++.h>
using namespace std;

char ans[2005];

int main(){
//  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    char op;string key;//密钥
    string t,s;//明文
    cin>>op>>key;

    getline(cin,t);
    getline(cin,t);

    int n=key.size(),m=t.size(); 

    for(int i=0;i<m;i++){
        if(t[i] >= 'a' && t[i] <= 'z')s+=t[i];
        if(t[i] >= 'A' && t[i] <= 'Z')s+=t[i]+32;
    }
    m=s.size();
    if(op=='E'){
        int cnt=-1;
        for(int i=0;i<=n;i++){
            int b;
            if(i<n)b=key[i]-'a'+2;
            else b=1;
            if(i%2){
                for(int x=m-1,k=0;x>=0;x--){
                    if(ans[x]==0)k++;
                    if(k == b)ans[x]=s[++cnt],k=0;
                }
            }
            else for(int x=0,k=0;x<m;x++){
                if(ans[x] == 0)k++;
                if(k == b)ans[x]=s[++cnt],k=0;
            }
        }
        cout<<ans;
        return 0;
    }
    if(op == 'D'){
        int cnt=-1;
        for(int i=0;i<=n;i++){
            int b;
            if(i<n)b=key[i]-'a'+2;
            else b=1;
            if(i%2){
                for(int x=m-1,k=0;x>=0;x--){
                    if(s[x]!=0)k++;
                    if(k == b)ans[++cnt]=s[x],s[x]=0,k=0;
                }
            }
            else for(int x=0,k=0;x<m;x++){
                if(s[x]!=0)k++;
                if(k == b)ans[++cnt]=s[x],s[x]=0,k=0;
            }
        }
        cout<<ans;
    }
} 

:::