首先,这道题直接模拟的话会超时,因为直接模拟的话时间复杂度时是$O(Q*N)$是不允许的,那如何优化,操作一一定不能在优化了,那就看操作二,可以发现,操作二只有在奇数时才会对答案有变化,所以可以记录一下奇数还是偶数,如果是奇数的话,将操作一偏移一下,可以发现如果是奇数的话,操作一在执行的时候在前半部分的位置会到x+n,后半部分会到x-n,在执行操作一如果是偶数的话可以先进行偏移,在进行交换即可
#include<cstdio>
#include<iostream>
#include<vector>
#include<map>
#include<cstring>
#include<array>
#include<queue>
#include<algorithm>
#include<set>
#include<cmath>
using namespace std;
using i64=long long;
//using i128=__int128;
const i64 INF=1e18;
const int mod=998244353;
//const int N=1e9+7;
void solve(){
int n;
cin>>n;
string s;
cin>>s;
int q;
cin>>q;
bool flag=false;
while(q--){
int t,a,b;
cin>>t>>a>>b;
a--,b--;
if(t==1){
if(flag){
a=(a<n ? a+n : a-n);
b=(b<n ? b+n : b-n);
}
swap(s[a],s[b]);
}
else{
flag=!flag;
}
}
if(flag){
s=s.substr(n)+s.substr(0,n);
}
cout<<s<<'\n';
}
int main(){
int _=1;
//cin>>_;
while(_--)solve();
return 0;
}
0 回复
0 转发
0 喜欢
0 阅读



