1. 程式人生 > >Right-Left Cipher Codeforces Round #528 (Div. 2-A

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大於兩個字 符陣列 長度的總和,就結束。