第三題:字元遷移
題意:給你一個區間,把這個區間裡的所有字元都++,字母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;
}