NC229721. 子字符串翻转
描述
输入描述
第一行包含一个长度为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)