#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, q;
cin >> n >> q;
string s;
cin >> s;
vector<int> diff(n + 1, 0); // 差分数组
while (q--) {
ll l, r, k;
cin >> l >> r >> k;
k %= 26;
diff[l - 1] += k;//下标从0开始的
diff[r] -= k;
}
// 计算前缀和
for (int i = 1; i < n; ++i) {
diff[i] += diff[i - 1];
}
for (int i = 0; i < n; ++i) {
int offset = s[i] - 'a';//这点的差值最大为25也就是z减去‘a’的差值
offset = (offset + diff[i]) % 26;
s[i] = 'a' + offset;
}
cout << s << endl;
return 0;
}
这个题很多人都易出错,我们找到一个简单的方法,帮助我们来理解,而且不易错,我们难点就是末尾移动到前面的时候,这点很难写
针对移动字符串的移动我决定说一下 字符串在二进制中0到25,这样就有26个了
a为97然后z为122这两者的差距就是25
然后我们要找到一个简单的写法,而且要保证错误率低,还易懂的写法
首先我们在写的时候不知道改怎么确定末尾的移动方式,这也是一个易错点,并且很容易出错,然后把直接脑袋绕昏,并且自己感觉还没有错。不知道错在哪
现在按照我下面来写就不会出错,还比较简单
我们就把当前字符的ascll值加上你要移动的位置然后对26取余这样你就得到你要移动的差值了
然后你在加上字符a的ascll值就到了你要移动到的位置,这样你就肯定不会出错了,下面看代码
比如说我们要移动k位,然后是z来移动的
#include <bits/stdc++.h>
using namespace std;
int main(){
int k=1;//随便你变化
int num='z'-'a'+k;
num%=26;
char c='a'+num;
cout<<c;
}
答案就出来了不会错,记住这个简单的方法就行了。