循环移动

(cyclic.cpp/c/pas)

(1s/256M)

问题描述

给出一个字符串SN个操作。每个操作用三元组(L, R, K)进行描述:操作将字符串第L个到第R个位置构成的子串循环移动K次。一次循环移动就是将字符串最后的这个字符移动到第一位,其余的字符顺次后移。

例如,对于字符串abacaba,操作(L=3, R=6, K=1)后得到的字符串即为abbacaa

求出在N个操作后得到的字符串。

 

输入格式(cyclic.in)

第一行一个字符串S

第二行一个整数N,代表操作的总数。

接下来N行每行三个数L,R,K,每行代表一个操作。

 

输出格式(cyclic.out)

一行一个字符串,代表N个操作后的字符串。

 

样例输入

abbacaa

2

3 6 1

1 4 2

 

样例输出

ababaca

 

数据范围与约束

|S|为字符串S的长度。

对于30%的数据,|S|<=100, N<=100, K<=100

对于100%的数据,|S|<=10000, N<=300, K<=1000,000,1<=L<=R<=|S|

 

#include<cstdio>
#include<cstring>
#define N 10010
using namespace std;
char s[N],tmp[N];
int n,l,r,k,t,len;
int main()
{
    freopen("cyclic.in","r",stdin);
    freopen("cyclic.out","w",stdout);
    scanf("%s",s+1);
    len=strlen(s+1);
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d%d%d",&l,&r,&k);
        k%=(r-l+1);
        if(!k) continue;
        t=l;
        for(int i=r-k+1;i<=r;i++) tmp[t++]=s[i];
        for(int i=l;i<=r-k;i++) tmp[t++]=s[i];
        for(int i=l;i<=r;i++) s[i]=tmp[i];
    }
    printf("%s",s+1);
}
View Code

相关文章: