B3937 [语言月赛 202402] 翻转和反转 题解

· · 题解

Source & Knowledge

2024 年 2 月语言月赛,由洛谷网校入门计划/基础计划提供。

出题人题解。

题目大意

有一个串,反复对其做翻转或者反转操作,你需要求出这些操作做完后的串。

题目分析

本题考查对字符串、数组、循环结构的运用。

我们很容易发现,反转两次和翻转两次的结果都不变,并且这两个操作相互独立。于是我们统计反转的次数与翻转的次数。如果反转的次数是一个奇数,那么相当于反转了 1 次,直接模拟这个操作即可;如果反转的次数是一个偶数,相当于没有反转,不进行任何操作。如果翻转的次数是一个奇数,那么相当于翻转了 1 次,直接模拟这个操作即可;如果翻转的次数是一个偶数,相当于没有翻转,不进行任何操作。

cin >> n >> q;
for (long long i = 1; i <= n; i++){
    cin >> s[i];
}
for (long long i = 1; i <= q; i++){
    char w;
    cin >> w;
    if (w == '1'){
        cnt[1]++;
    }else{
        cnt[2]++;
    }
}
if (cnt[1] % 2 == 1){
    ll ct = 1;
    for (long long i = n; i >= 1; i--){
        s2[ct] = s[i];
        ct++;
    }
    for (long long i = 1; i <= n; i++){
        s[i] = s2[i];
    }
}
if (cnt[2] % 2 == 1){
    for (long long i = 1; i <= n; i++){
        if (s[i] == '1'){
            s[i] = '0';
        }else{
            s[i] = '1';
        }
    }
}
for (long long i = 1; i <= n; i++){
    cout << s[i];
}

视频题解