B:
题意:给定一个字符串,然后给定m个数字
对于每个数字ai的含义是,将ai到n-ai+1的字符串给翻转一遍。
要求输出m次翻转之后的字符串。
想法就是判断第i个位置的字符是翻转了奇数次,还是偶数次就可以了,翻转了偶数次代表没翻转
自己的思想的是:将m个数字存储下来,然后排序。对于每个str[i], 1<=i<strlen(str),
使用index=upper_bound(a,a+m,i),upper_bound(a,a+m,i)的返回值是返回数组中第一个比i大的元素迭代器,如果没有,则返回指向最后一个元素后面的迭代器
所以index-a代表在数组a中,比i小的数字有多少个。
所以如果index-a是奇数,那么代表位置i翻转了奇数次,输出str[n-i+1]
如果是偶数,代码位置i翻转了偶数次,输出str[i]
1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 using namespace std; 5 const int N = 200000 + 10; 6 char str[N]; 7 int a[N]; 8 bool vis[N]; 9 10 int main() 11 { 12 int m,i,x,n; 13 scanf("%s",str+1); 14 scanf("%d",&m); 15 n = strlen(str+1); 16 for(i=1; i<=m; ++i) 17 scanf("%d",&a[i]); 18 sort(a+1,a+m+1); 19 int nn = n/2,*index; 20 for(i=1; i<=nn; ++i) 21 { 22 23 index = upper_bound(a+1,a+m+1,i); 24 if((index-a-1)%2==1) 25 { 26 printf("%c",str[n-i+1]); 27 vis[n-i+1] = true; 28 } 29 else 30 printf("%c",str[i]); 31 32 } 33 for(i=nn+1; i<=n; ++i) 34 { 35 if(vis[i]) 36 printf("%c",str[n-i+1]); 37 else 38 printf("%c",str[i]); 39 } 40 puts(""); 41 }
但是看了别人
时间: 2024-10-25 12:10:37