cf 529div3 A Repeating Cipher

版权声明:那个,最起码帮我加点人气吧,署个名总行吧 https://blog.csdn.net/qq_41670466/article/details/85317043

Polycarp loves ciphers. He has invented his own cipher called repeating.

Repeating cipher is used for strings. To encrypt the string s=s1s2…sms=s1s2…sm (1≤m≤101≤m≤10), Polycarp uses the following algorithm:

  • he writes down s1s1 ones,
  • he writes down s2s2 twice,
  • he writes down s3s3 three times,
  • ...
  • he writes down smsm mm times.

For example, if ss="bab" the process is: "b" →→ "baa" →→ "baabbb". So the encrypted ss="bab" is "baabbb".

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 first line contains integer nn (1≤n≤551≤n≤55) — the length of the encrypted string. The second 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 exactly nn.

It is guaranteed that the answer to the test exists.

Output

Print such string ss that after encryption it equals tt.

题意大致就是给你一个字符串,这个字符串是被加密后的,让你求源字符串,加密的规则是原字符串第一个字符写一遍,第二个字符写两边,第三个字符写三遍,依次类推。

思路:就是用一个数组维护一个等差数列的前n项和,然后根据这个前n项和去在加密字符串里找,到原字符串

代码

#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int num[60] = { 0, };
void cal()
{
		int cnt = 2;
		for (int i = 1; i <= 55; i++)
				num[i] = num[i - 1] + cnt++;

}

int main()
{
		cal();
		int n;
		scanf("%d", &n);
		num[n + 1] = 100;
		string s;
		cin >> s;
		int i = 0;
		int p = 1;
		while (i <= n)
		{
				printf("%c", s[i]);
				i =num[p++];
		}
		printf("\n");
		//system("pause");
		return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41670466/article/details/85317043
今日推荐