#include <iostream>
#include<string>
using namespace std;
int main() {
int n, q, l, r;
cin >> n >> q;
string str;
cin >> str;
while (q--) {
cin >> l >> r;
for (int i = l-1, j = 0; i < r; i++, j++) {
str.insert(i+j, 1, str[i+j]);//从str[l-1]开始,每次偏移1位为下一次插入
}
}
cout << str;
}
// 64 位输出请用 printf("%lld")
/*
#include <iostream>
#include<string>
using namespace std;
int main() {
int n,q,l,r;
cin>>n>>q;
string str;
cin>>str;
while(q--){
cin>>l>>r;
string a;
a+=str[l-1];
for(int i=l;i<r-1;i++){
a+=str[i];
a+=str[i];
}a+=str[r-1];
string strl(str,0,l),strr(str,r-1,str.size()-r+1);
//cout<<"strl="<<strl<<" strr="<<strr<<endl;
//cout<<"str="<<str<<" a="<<a<<endl;
str=strl+a+strr;
//cout<<str<<endl;
}
cout<<str;
}
*/
这次是第二版,第一次写的时候直接用string的拼接,但是会用很多内存和字符串拷贝,这次搞insert,可以提前申请空间够,然后insert就不需要移动,每次就o(r-l)好了,总和大概是o(q^(r-l))

京公网安备 11010502036488号