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 }
View Code

相关文章:

  • 2021-06-14
  • 2021-12-24
  • 2021-06-11
  • 2022-02-18
  • 2021-07-27
  • 2021-08-19
  • 2022-02-28
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-10-18
  • 2021-08-08
  • 2021-12-05
  • 2022-01-29
  • 2021-11-08
相关资源
相似解决方案