列表

详情


NC229721. 子字符串翻转

描述

有天皮卡丘收到了一个长度为n的字符串s,其下标从1开始。
但皮卡丘并不喜欢这个字符串,所以它决定通过m次操作改变字符串的原有顺序,每次它可以选择一个正整数,并将字符串的下标为到n-+1的这一段子字符串进行翻转(数据保证 * 2 <= n)。你的任务就是找到经过m 次翻转变化之后的字符串s。

输入描述

第一行包含一个长度为n的字符串s(1 <= n <= 100000),该字符串只包含小写字母
第二行包含一个整数m(1 <= m <= 100000),代表次数
第三行包含m个以空格为分隔的数,第i个数表示皮卡丘在第i次选择的数

输出描述

用一行输出在m次后字符串s的样子。

示例1

输入:

abcde
2
2 2

输出:

abcde

示例2

输入:

asdfge
1
2

输出:

agfdse

示例3

输入:

abcdef
3
1 2 3

输出:

fbdcea

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 10ms, 内存消耗: 808K, 提交时间: 2021-11-27 19:30:35

#include "stdio.h"
#include "string.h"
char a[100009];
int b[100009];
int main()
{
	scanf("%s",a+1);
	int n,i,l;
	l=strlen(a+1);
	scanf("%d",&n);
	while(n--)
	{
		int m;
		scanf("%d",&m);
		b[m]+=1;
		b[l-m+1+1]-=1;
	}
	for(i=2;i<=l;i++)
	b[i]+=b[i-1];
	for(i=1;i<=l;i++)
	{
		if(b[i]%2==0)
		printf("%c",a[i]);
		else
		printf("%c",a[l-i+1]);
	}
 } 

C++ 解法, 执行用时: 919ms, 内存消耗: 1704K, 提交时间: 2021-11-17 19:34:29

#include<iostream>
using namespace std;
int main(){
	int n,m;
	int a[100005];
	int b[100005]={0};
	string s;
	cin>>s;
	n=s.length();
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>a[i];
		for(int j=a[i];j<=n-a[i]+1;j++){
			b[j]++;
		}
	}
	for(int i=0;s[i];i++)
		if(b[i+1]%2==0) cout<<s[i];
		else cout<<s[n-i-1];
	return 0;
}

Python3 解法, 执行用时: 680ms, 内存消耗: 14328K, 提交时间: 2021-11-07 13:26:36

s = input()
n = len(s)
m = int(input())
ai = input().split(' ')
d = dict()
for a in ai:
	if a not in d or d[a]==0:
		d[a]=1
	elif d[a]==1:
		d[a]=0
for a in d:
	if(d[a]==1):
		k=s[int(a)-1:n-int(a)+1][::-1]
		s=s[:int(a)-1] + k + s[n-int(a)+1:]
print(s)

上一题