zoukankan      html  css  js  c++  java
  • 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
    ", 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
    ", mp+1);
    36 }
  • 相关阅读:
    ES6 class -- Class 的基本语法
    ES6 Promise --回调与Promise的对比、信任问题、错误处理、Promise的状态、以及Promise对象的常用方法
    移动端调试,手机缓存清不掉
    JAR 介绍-百度百科
    一致性哈希的基本概念
    Java线程池的配置
    java多线程面试题整理及答案(2018年)
    Java多线程面试题整理
    IntelliJ Idea 常用快捷键
    RESTful规范
  • 原文地址:https://www.cnblogs.com/hujunzheng/p/4382105.html
Copyright © 2011-2022 走看看