题意
字符串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函数。
代码
#includechar 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#include 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<