蓝桥杯第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;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步