题解:P17359 [ECNA 2024] Leapfrog Encryption
TimelessWelkin · · 题解
按照题目意思模拟即可。
加密只需要按照题目意思模拟。代码如下。
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;
而解密稍微复杂一些。需要对给的串扫一遍,有字符则计数器增加。当计数器到达对应的
对应的代码段如下:
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;
}
}
:::