C - Pasha and String

Pasha got a very beautiful string s for his birthday, the string consists of lowercase Latin letters. The letters in the string are numbered from 1 to |s| from left to right, where |s| is the length of the given string.

Pasha didn’t like his present very much so he decided to change it. After his birthday Pasha spent m days performing the following transformations on his string — each day he chose integer ai and reversed a piece of string (a segment) from position ai to position |s| - ai + 1. It is guaranteed that 2·ai ≤ |s|.

You face the following task: determine what Pasha’s string will look like after m days.

Input
The first line of the input contains Pasha’s string s of length from 2 to 2·105 characters, consisting of lowercase Latin letters.

The second line contains a single integer m (1 ≤ m ≤ 105) — the number of days when Pasha changed his string.

The third line contains m space-separated elements ai (1 ≤ ai; 2·ai ≤ |s|) — the position from which Pasha started transforming the string on the i-th day.

Output
In the first line of the output print what Pasha’s string s will look like after m days.

Examples
Input
abcdef
1
2
Output
aedcbf
Input
vwxyz
2
2 2
Output
vwxyz
Input
abcdef
3
1 2 3
Output
fbdcea

给一个字符串,给出反转字符串的次数,再给出每次从ai反转到s-ai-1。输出反转后的字符串。
这道题可以用下标法记录每一次从哪里反转,数字小的反转(要反转的字符更多)会对数字大的完成影响。所以标记之后从小到大循环,只要下标法记录的次数是奇数,就讲第ai个字符与第s-ai-1个字符进行位置调换。我一直只想着将ai排序过后最大的ai后面也要反转,忘了我的循环已经可以实现这个操作,加了一些内容反而不对。

#include"stdio.h" 
#include"string.h" 
#include"math.h" 
#include"stdlib.h"
#include"iostream" 
#include"algorithm" 
#include"cstring"
using namespace std; 
int main() 
{
 	char a[200005];
 	while(~scanf("%s",a))
 	{
 		int n,aa[100005],b[100005],p=0;
 		scanf("%d",&n);
 		int y=strlen(a);
 		memset(b,0,sizeof(b));
 		for(int i=0;i<n;i++)
 		{
 			scanf("%d",&aa[i]);
 		}
 		sort(aa,aa+n);
 		for(int i=0;i<n;i++)
 		{
 			b[aa[i]-1]++;
 		}
 		for(int i=0;i<y/2;i++)
 		{
 			if((p+b[i])%2!=0)
 			{
			 	char q=a[i];
			 	a[i]=a[y-i-1];
 				a[y-i-1]=q;
 			}
		 	p+=b[i];
		}
 		printf("%s\n",a);
 	}
 	return 0;
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值