测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A28819. 字母移位

填空题 困难

题目描述

字母移位

题目描述

字母移位:表示将字母按照字母表的顺序进行移动。

例如:'b' 向右移动一位是'c’,'f'向左移动两位是'd'。

特别地,'a'向左移动一位是'z','z'向右移动一位是'a'。

给定一个仅包含小写字母且长度为 n 的字符串 s,以及 n 个正整数 a1,a2,a3……an,接下来对字符串s按如下规律操作:

1.将第 1位字符向左移动 a1 位;

2.再将第 1、2 位字符都向右移动 a2位;

3.再将第 1、2、3 位字符都向左移动 a3位;

4.再将第 1、2、3、4 位字符都向右移动 a4位;

以此类推,直到将s的第1到第n位字符都(按规律向左或向右)移动an 位。

最后,将操作完成后的字符串s输出。

例如:n=5,字符串s="abcde",5 个正整数为1,3,5,7,9;

将"abcde"的第 11 位字符"a"向左移动 1位,s变为"zbcde"

再将"zbcde"的前 2 位字符"zb" 向右移动 3 位,s变为"cecde"

再将"cecde" 的前 3位字符"cec"向左移动5 位,s 变为"xzxde"

再将"xzxde" 的前 4 位字符"xzxd"向右移动7 位,s变为"egeke"

再将"egeke"的前 5 位字符"egeke" 向左移动 9 位,s 变为"vxvbv"。

最后,将操作完成后的字符串"vxvbv"输出。

输入格式

第一行输入一个整数n(1≤n≤105)

第二行输入一个仅包含小写字母且长度为 n的字符串s

第三行输入 n个整数a1、a2…an(1≤a≤10^9),整数之间以一个空格隔开

输出格式

输出一个字符串,表示操作完成后的字符串s

输入样例

5
abcde
1 3 5 7 9

输出样例

vxvbv

参考答案

#include <iostream> using namespace std; string s; // 将要移位的字符串 int n, a[100001], b[100001]; // n 为字符串长度,a用于存储输入的每步移位量,b 用于存储前缀和 int main() { cin >> n; // 输入字符串的长度 cin >> s; // 输入字符串 for (int i = 1; i <= n; i++) { cin >> a[i]; // 输入每个位置的移位量 a[i] %= 26; // 将移位量对 26 取模(因为一个循环之后字母会回到原位) if (i & 1) { // 如果 i 是奇数 a[i] *= -1; // 则反转移位的方向,因为题目要求奇数次的移位要向左 } } b[n] = a[n]; // 初始化 b 数组的最后一个元素 for (int i = n - 1; i >= 1; i--) { b[i] = (a[i] + b[i + 1]) % 26; // 逆序计算 b 数组,即前缀和数组,用于存储最终的移位量 } for (int i = 1; i <= n; i++) { // 遍历字符串中的每个字符 int x = s[i - 1] - 96; // 字母转换为 1-26 的数字('a' 转换为 1,'z' 转换为 26) if ((x + b[i]) % 26 == 0) { //如果移位后字母应该变成 'z' s[i - 1] = 'z'; continue; } s[i - 1] = char((x + b[i] + 26) % 26 + 96); // 应用最终的移位量,并将数字转换回字符 } cout << s; // 输出移位后的字符串 return 0; // 程序正常结束 }
上一题 下一题