当每次遇到操作二时,不进行操作,而是对两个数进行偏移。
过程:
1.当第一次遇到操作二时,对后续每次的操作一的交换索引进行偏移。如果左索引在前本段,对应于如果进行操作二后位置在后半段,相当于对左索引+n,即还是交换相对应的那个字符;如果在字符右半段,即-n。右索引同理。
2.当遇到第二次操作二时,则原本暴力方法进行第一次的操作二后再执行现在的一次操作二,则变成了现在对索引偏移(不进行真实的操作二)的结果。相当于变回来了,对于后续的操作一,则不需要再进行偏移,因为跟每次都执行操作一的结果统一了。
3.以此类推,遇到奇数次的操作二,后续的操作一跟暴力解法结果,每次都差一个操作二的步骤变换。遇到偶数次的操作二,则后续的操作一结果都一样。
过程:
1.当第一次遇到操作二时,对后续每次的操作一的交换索引进行偏移。如果左索引在前本段,对应于如果进行操作二后位置在后半段,相当于对左索引+n,即还是交换相对应的那个字符;如果在字符右半段,即-n。右索引同理。
2.当遇到第二次操作二时,则原本暴力方法进行第一次的操作二后再执行现在的一次操作二,则变成了现在对索引偏移(不进行真实的操作二)的结果。相当于变回来了,对于后续的操作一,则不需要再进行偏移,因为跟每次都执行操作一的结果统一了。
3.以此类推,遇到奇数次的操作二,后续的操作一跟暴力解法结果,每次都差一个操作二的步骤变换。遇到偶数次的操作二,则后续的操作一结果都一样。
#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
int main()
{
int len,q;
cin>>len;
string s;
cin>>s;
cin>>q;
bool flag = false;
while(q--)
{
int a,m,n;
cin>>a>>m>>n;
m--,n--;
if(a == 1)
{
if(flag)
{
m = (m < len ? m+len : m-len);
n = (n < len ? n+len : n-len);
}
swap(s[m],s[n]);
}
if(a == 2)
flag = !flag;
}
if(flag)
{
reverse(s.begin(),s.end());
reverse(s.begin(),s.begin()+len);
reverse(s.begin()+len,s.end());
}
cout<<s;
}
0 回复
0 转发
0 喜欢
1 阅读



