Right-Left Cipher Codeforces Round #528 (Div. 2-A
題面:
Polycarp loves ciphers. He has invented his own cipher called Right-Left.
Right-Left cipher is used for strings. To encrypt the string s=s1s2…sns=s1s2…sn Polycarp uses the following algorithm:
- he writes down s1s1 ,
- he appends the current word with s2s2 (i.e. writes down s2s2 to the right of the current result),
- he prepends the current word with s3s3 (i.e. writes down s3s3 to the left of the current result),
- he appends the current word with s4s4 (i.e. writes down s4s4 to the right of the current result),
- he prepends the current word with s5s5 (i.e. writes down s5s5 to the left of the current result),
- and so on for each position until the end of ss .
For example, if ss ="techno" the process is: "t" →→ "te" →→ "cte" →→ "cteh" →→ "ncteh" →→ "ncteho". So the encrypted ss ="techno" is "ncteho".
Given string tt — the result of encryption of some string ss . Your task is to decrypt it, i.e. find the string ss .
Input
The only line of the input contains tt — the result of encryption of some string ss . It contains only lowercase Latin letters. The length of tt is between 11 and 5050 , inclusive.
Output
Print such string ss that after encryption it equals tt .
Examples
Input
ncteho
Output
techno
Input
erfdcoeocs
Output
codeforces
Input
z
Output
z
中文的意思就 是 將一個字串 按照一個 規則來加密,就是 右-左 的規則,意思就是,原字串的第二位是右,不動,下一位就該輪到左了,就把這個字元拿到字串的最前面,然後繼續右-左 來安排各個字元 的位置。
圖解:
而本題 是讓你解密 ,輸如加密後的字串,輸出解密後的 字串。
程式碼:
#include<stdio.h>
#include<iostream>
using namespace std;
#include<string.h>
#include<stdlib.h>
const int maxn=105;
int main()
{
int num;
int i;
int j=0;
char b[maxn];
char c[maxn];
int len;
char a[maxn];
gets(a);
len=strlen(a);
if(len==2||len==1)
cout<<a;
else
{
if(len%2==0)
num=len/2-1;
else
num=(len+1)/2-1;
for(i=0;i<num;i++)
b[j++]=a[i];
b[j]=0;
j=0;
for(;a[i];i++)
c[j++]=a[i];
c[j]=0;
int len1=strlen(b);
int len2=strlen(c);
int z=len1-1;
int l=0;
j=1;
cout<<c[0];
int m=1;
while(l<(len1+len2-1))
{
if(m==0)
{
m=!m;
cout<<b[z--];
}
else
{
m=!m;
cout<<c[j++];
}
l++;
}
}
return 0;
}
我的解題思路是,如果字串 的數量小於3的時候,根本就不用換 ,直接輸出字串就可以。而如果大於等於3的時候,這時就會移動某些字元,我先找到原來字串第一個字元的位置,如果字串位數 是奇數,原字串第一個字元 下表就是 (len+1)/2-1, 如果是 偶數的話,那就是(len)/2; 將 首字元 兩邊的 字元都 各自放到一個 字元陣列中 。接下來,就是 如何 合併兩個陣列,來恢復 原字串。首先 先輸出 那個 固定的(不參與右-左)的字元,接下來 我1 和 0來模擬 是否 該輸出 是 左 的字元,如果是 0,就倒序輸出(因為是倒序移動到前面的)首字元前面的,否則 就 輸出 是右 的 字元。這裡 每輸出一位字元,就用計數器L計入,當L大於兩個字 符陣列 長度的總和,就結束。