逛了下题解发现有许多大佬用差分做,但本蒟蒻想不到差分,于是只能纯模拟了qwq
题目大意:
给定一个字符串 s,对其进行 m 次操作,第 i 次操作给一个数字 ai
,表示将字符串 s 的第 x 个位置到第 len−x+1 这段字翻转,求 m 次操作后的结果。
思路与实现:
本题要求从 x 到 len−x+1 的位置调换,那我们可以分别处理前半部分和后半部分:每读入一个 ai就判断这个 ai是在字符串的前半部分还是后半部分,如果是后半部分就从字符串的一半开始模拟,否则就从字符串的开头开始模拟,每次判断如果 ai>j 就交换 ai和 alen−i+1的位置,最后输出得到的字符串即可。
具体而言,实现时可以按照以下步骤进行:
读入字符串 s 和操作次数 m;
对于每次操作,读入数字 ai,并根据其在前半部分还是后半部分进行模拟;
对于每次模拟,从头或尾开始遍历字符串 s,对于位置 i,如果 i≤j,则直接跳过;
否则,交换 si 和 slen−i+1 的位置;
重复步骤 2-3,直到进行完 m 次操作;
输出最终得到的字符串。
这里就不放全部代码了,只放模拟前半部分的函数了:
void str_ans1(){
for(int i=0;i<b;i++){
for(int j=0;j<=c;j++){
if(a[i]-1<=j){
swap(q[j],q[d-j+1]);
}
}
}
cout<<q;
}