ZOJ-2208復号

1547 ワード

2208:符号化復号.
Theres no place like home on a snowy night
t o i o y
h p k n n
e l e a i
r a h s g
e c o n h
s e m o t
n l e w x
縦にn列の行列に並び、xで補完します.ヘビ出力を最初から開始し、暗号化を完了します.
パスワードを指定し、復号します.
SampleInput
5
toioynnkpheleaigshareconhtomesnlewx
3
ttyohhieneesiaabss
0
SampleOutput
theresnoplacelikehomeonasnowynightx
thisistheeasyoneab
構想:ブロックで処理する.奇数群のブロックと偶数配列のブロック順序は規則的である.補完xについては単独で処理する.

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;


int main()
{	
	char encrypt[201];
	int n;
	int len;
	int num;
	int pad;

	while(1)
	{

		cin>>n;
		pad=0;
		if(n==0)
			break;
		cin>>encrypt;
		len=strlen(encrypt);
		num=len/n;

		for(int i=len-1;i>0;i=i-n)
		{
			if(encrypt[i]=='x')
				pad++;
			else
				break;
		}

		//    
		for(int i=0;i<n;i++)
		{
			//    
			for(int j=0;j<num;j++)
			{
				//
				if(!(i==n-1&&j>num-1-pad))
				{	
					if(j%2==0)
						cout<<encrypt[n*j+i];
					else
						cout<<encrypt[n*j+n-1-i];
				}

			}
		}
		for(int i=0;i<pad;i++)
			cout<<'x';
		cout<<endl;
	}
	


}