codeforces B. Pasha and String(贪心)

题意:给定一个长度为len的字符序列,然后是n个整数,对于每一个整数ai,
将字符序列区间为[ai,len-ai+1]进行反转。求出经过n次反转之后的序列!

 1 /*
 2      思路1:将区间为偶数次的直接去掉!对剩下的区间进行反转。超时了,智商上的压制...
 3 */
 4 #include<iostream>
 5 #include<cstdio>
 6 #include<algorithm>
 7 #include<stack>
 8 #include<cstring>
 9 #include<vector>
10 #define N 100005
11 using namespace std;
12 char mp[2*N];
13 int num[N];
14 int cnt[N*2];
15
16 void my_swap(int &a, int &b){
17     a^=b;
18     b^=a;
19     a^=b;
20 }
21
22 void my_reverse(int x, int y){
23     for(int i=x, j=y; i<j; ++i, --j){
24         char tmp = mp[i];
25         mp[i] = mp[j];
26         mp[j] = tmp;
27     }
28 }
29
30 int main() {
31      scanf("%s", mp+1);
32     int m, mm=0;
33     cin>>m;
34     for(int i=0; i<m; ++i){
35         scanf("%d", &num[i]);
36         ++cnt[num[i]];
37     }
38
39     int len = strlen(mp+1);
40     for(int i=1; i<=len/2; ++i){
41         if(cnt[num[i]] + cnt[len-num[i]+1])%2!=0){
42             int x = num[i];
43             int begin = x, end= len-x+1;
44             if(begin > end) my_swap(begin, end);
45             my_reverse(begin, end);
46         }
47     }
48     printf("%s\n", mp+1);
49 }
 1 /*
 2     思路2:仔细分析,每一个反转的区间左右是对称的,如果[ai, len-ai+1]区间进行反转,
 3     那么就有str[ai]与str[len-ai+1]交换,str[ai+1]与str[len-ai]交换.....
 4     也就是ai位置发生交换,那么ai+1,ai+2...len/2也一定发生交换。如果ai位置的交换的次数
 5     为偶数就不用交换,为奇数就进行交换!
 6 */
 7 #include<iostream>
 8 #include<cstdio>
 9 #include<algorithm>
10 #include<stack>
11 #include<cstring>
12 #include<vector>
13 #define N 100005
14 using namespace std;
15 char mp[2*N];
16 int cnt[N*2];//统计每一个位置交换的次数
17
18 int main() {
19     scanf("%s", mp+1);
20     int m, mm=0;
21     scanf("%d", &m) ;
22     int len = strlen(mp+1);
23     while(m--){
24         int x;
25         scanf("%d", &x);
26         ++cnt[x], ++cnt[len-x+1];
27     }
28
29     for(int i=2; i<=len/2; ++i)
30         cnt[i] += cnt[i-1];//第i个位置交换,那么第i+1,i+2..len/2个位置也一定发生交换
31
32     for(int i=1; i<=len/2; ++i)
33         if(cnt[i]%2!=0)//奇数位置交换
34             swap(mp[i], mp[len-i+1]);
35     printf("%s\n", mp+1);
36 }
时间: 2024-10-07 01:57:57

codeforces B. Pasha and String(贪心)的相关文章

[ An Ac a Day ^_^ ] CodeForces 525B Pasha and String 技巧

题意就是一次次翻转字符串 然后输出最终的字符串 暴力一发O(n*m)果然超时了 因为每次翻转的的都是a-1到对称位置 所以一个位置翻转两次等于没有操作 所以只需要记录一下len/2的位置前的操作次数 O(len/2)…… 1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<math.h> 5 #include<string.h> 6 #include&

codeforces 525B Pasha and String

#include <cstdio> #include <iostream> #include <cstring> #include <set> #include <cmath> #include <algorithm> #include <vector> #include <map> using namespace std; char a[200010]; int num[200010]; int main()

Codeforces Round #297 (Div. 2)B Pasha and String

B. Pasha and String time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Pasha got a very beautiful string s for his birthday, the string consists of lowercase Latin letters. The letters in the

Pasha and String(思维,技巧)

Pasha and String Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 525B Description Pasha got a very beautiful string s for his birthday, the string consists of lowercase Latin letters. Th

Codeforces Round #300-Tourist&#39;s Notes(贪心)

Tourist's Notes Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Description A tourist hiked along the mountain range. The hike lasted for n days, during each day the tourist noted height above the sea level

Codeforces 432E Square Tiling(构造+贪心)

我们通常这么写 using (SqlDataReader drm = sqlComm.ExecuteReader()) { drm.Read();//以下把数据库中读出的Image流在图片框中显示出来. MemoryStream ms = new MemoryStream((byte[])drm["Logo"]); Image img = Image.FromStream(ms); this.pictureBox1.Image = img; } 我的写数据 private void b

Codeforces 442B Andrey and Problem(贪心)

题目链接:Codeforces 442B Andrey and Problem 题目大意:Andrey有一个问题,想要朋友们为自己出一道题,现在他有n个朋友,每个朋友想出题目的概率为pi,但是他可以同时向多个人寻求帮助,不过他只能要一道题,也就是如果他向两个人寻求帮助,如果两个人都成功出题,也是不可以的. 解题思路:贪心,从概率最大的人开始考虑,如果询问他使得概率变大,则要询问. #include <cstdio> #include <cstring> #include <a

Educational Codeforces Round 25 F. String Compression(kmp+dp)

题目链接:Educational Codeforces Round 25 F. String Compression 题意: 给你一个字符串,让你压缩,问压缩后最小的长度是多少. 压缩的形式为x(...)x(...)  x表示(...)这个出现的次数. 题解: 考虑dp[i]表示前i个字符压缩后的最小长度. 转移方程解释看代码,这里要用到kmp来找最小的循环节. 当然还有一种找循环节的方式就是预处理lcp,然后通过枚举循环节的方式. 这里我用的kmp找的循环节.复杂度严格n2. 1 #inclu

Codeforces 56D Changing a String 编辑距离 dp

题目链接:点击打开链接 编辑距离,,== 一边dp一边记录前驱太累,,还是dp后找路径大法好 #include<iostream> #include<cstdio> #include<vector> #include<string.h> using namespace std; #define ll int #define N 1010 char s[N], t[N]; int dp[N][N], n, m; // 0为插入 1为删除 2 3为替换 stru