蓝桥杯第9场小白入门赛

第三题:字符迁移
题意:给你一个区间,把这个区间里的所有字符都++,字母a变成b,z变成a (这样的操作有多次,多次for循环肯定是过不去的)
思路:
1、思路1:就是多个for循环暴力,只能过66.7%(打蓝桥杯也够了)
2、思路2:看了一下csdn,这就是一个非常非常板的不能再板的差分问题(真实蓝桥的出题风格。。。还是有板子)
讲讲差分和前缀和:

具体实现:
有这样一个数组:这个数组记录了每个位置的字符需要++的次数。那么我们考虑能不能把这个数组当成一个前缀和数组呢?
每个位置都是由前面的数字加和得来的(这就是前缀和的思想)
刚好这个题就是这样,从起点开始,后面一段长度内都是受第一个影响的。而最后一个后面那个不受影响。

#include<bits/stdc++.h>
using namespace std;
#define int long long
using i64 = long long;

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, T;
    cin >> n >> T;
    string a;
    cin >> a;

    vector<int> diff(n + 1, 0);  // 差分数组,初始值为 0

    while (T--)
    {
        int l, r, k;
        cin >> l >> r >> k;

        // 在差分数组中更新操作范围的两个端点
        diff[l - 1] += k;
        diff[r] -= k;
    }

    // 根据差分数组计算字符的偏移量
    for (int i = 1; i < n; i++)
    {
        diff[i] += diff[i - 1];
    }

    // 修改字符
    for (int i = 0; i < n; i++)
    {
        a[i] = (a[i] - 'a' + diff[i]) % 26 + 'a';
    }

    cout << a;

    return 0;
}
posted @   涤生yang  阅读(48)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示