codeforces B. Pasha and String(贪心)

简介:
题意:给定一个长度为len的字符序列,然后是n个整数,对于每一个整数ai,

将字符序列区间为[ai,len-ai+1]进行反转。求出经过n次反转之后的序列!


/*
     思路1:将区间为偶数次的直接去掉!对剩下的区间进行反转。超时了,智商上的压制... 
*/ 
#include<iostream> 
#include<cstdio> 
#include<algorithm> 
#include<stack>
#include<cstring>
#include<vector>
#define N 100005
using namespace std;
char mp[2*N];
int num[N];
int cnt[N*2];

void my_swap(int &a, int &b){
    a^=b;
    b^=a;
    a^=b;
}

void my_reverse(int x, int y){
    for(int i=x, j=y; i<j; ++i, --j){
        char tmp = mp[i];
        mp[i] = mp[j];
        mp[j] = tmp;
    }
}

int main() {
     scanf("%s", mp+1);
    int m, mm=0;
    cin>>m; 
    for(int i=0; i<m; ++i){
        scanf("%d", &num[i]);
        ++cnt[num[i]];
    }
    
    int len = strlen(mp+1);
    for(int i=1; i<=len/2; ++i){
        if(cnt[num[i]] + cnt[len-num[i]+1])%2!=0){
            int x = num[i];
            int begin = x, end= len-x+1;
            if(begin > end) my_swap(begin, end);
            my_reverse(begin, end);
        }
    }
    printf("%s\n", mp+1);
}

/*
    思路2:仔细分析,每一个反转的区间左右是对称的,如果[ai, len-ai+1]区间进行反转,
    那么就有str[ai]与str[len-ai+1]交换,str[ai+1]与str[len-ai]交换.....
    也就是ai位置发生交换,那么ai+1,ai+2...len/2也一定发生交换。如果ai位置的交换的次数
    为偶数就不用交换,为奇数就进行交换! 
*/
#include<iostream> 
#include<cstdio> 
#include<algorithm> 
#include<stack>
#include<cstring>
#include<vector>
#define N 100005
using namespace std;
char mp[2*N];
int cnt[N*2];//统计每一个位置交换的次数 

int main() {
    scanf("%s", mp+1);
    int m, mm=0;
    scanf("%d", &m) ;
    int len = strlen(mp+1);
    while(m--){
        int x;
        scanf("%d", &x);
        ++cnt[x], ++cnt[len-x+1];
    }
    
    for(int i=2; i<=len/2; ++i)
        cnt[i] += cnt[i-1];//第i个位置交换,那么第i+1,i+2..len/2个位置也一定发生交换 
    
    for(int i=1; i<=len/2; ++i)
        if(cnt[i]%2!=0)//奇数位置交换 
            swap(mp[i], mp[len-i+1]);
    printf("%s\n", mp+1);
}

目录
相关文章
CF1553B Reverse String(数学思维)
CF1553B Reverse String(数学思维)
39 0
|
5月前
|
C++
【洛谷 P1000】超级玛丽游戏 题解(raw string literal)
这是一个关于使用字符画展示超级玛丽场景的编程题。无需输入,输出为指定的马里奥图案。提供的C++代码直接打印了预设的场景图案。
45 0
|
6月前
|
C++
E. Generate a String(典:贪心+动态规划)
E. Generate a String(典:贪心+动态规划)
|
机器学习/深度学习
CF1552A Subsequence Permutation(string排序大法)
CF1552A Subsequence Permutation(string排序大法)
37 0
|
人工智能
CF1660C Get an Even String(贪心)
CF1660C Get an Even String(贪心)
96 0
|
C++
【PAT甲级 - C++题解】1040 Longest Symmetric String
【PAT甲级 - C++题解】1040 Longest Symmetric String
64 0
|
算法 测试技术 C++
【C++】string OJ练习(二)
【C++】string OJ练习(二)
95 0
|
C++
【C++】string OJ练习(一)
【C++】string OJ练习
66 0
LeetCode 438. Find All Anagrams in a String
Given a string s and a non-empty string p, find all the start indices of p's anagrams in s. Strings consists of lowercase English letters only and the length of both strings s and p will not be larger than 20,100. The order of output does not matter.
89 0
LeetCode 438. Find All Anagrams in a String