BUPT 2017 summer training (for 16) #1I
题意
字符串s(1 ≤ |s| ≤ 10 000),有m(1 ≤ m ≤ 300)次操作,每次给l,r,k,代表将r位置插入l位置前,执行k(1 ≤ k ≤ 1 000 000)次。输出最后的s。
题解
等价与将字符串的[l...r-k]和[r-k+1...r]两部分调换一下。
k对r-l取模一下。然后模拟。
还有种方法是将两部分分别翻转,再整个字符串翻转一下。
也可以用stl的rotate函数。
代码
#include <cstdio>
char s[10001];
char t[10001];
int main(){
int m;
scanf("%s%d",s+1,&m);
while(m--){
int l,r,k;
scanf("%d%d%d",&l,&r,&k);
k%=(r-l+1);
for(int i=1;i<=k;++i)
t[i]=s[r-k+i];
for(int i=0;i<=r-l-k;++i)
s[r-i]=s[r-k-i];
for(int i=1;i<=k;++i)
s[l+i-1]=t[i];
}
printf("%s",s+1);
return 0;
}
rotate(beg,newBeg,end)
将区间[beg,end)内的元素进行旋转,执行后*newBeg成为新的第一元素;
#include <iostream>
#include <algorithm>
using namespace std;
string s;
int m;
int main(){
ios::sync_with_stdio(false);
cin>>s>>m;
while(m--){
int l,r,k;
cin>>l>>r>>k;
k%=(r-l+1);
rotate(s.begin()+l-1,s.begin()+r-k,s.begin()+r);
}
cout<<s;
return 0;
}