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;
}