码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round#297 div2

时间:2015-03-28 17:10:00      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:

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

但是看了别人

Codeforces Round#297 div2

标签:

原文地址:http://www.cnblogs.com/justPassBy/p/4374416.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!