循环移动

问题描述

给出一个字符串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<iostream>
#include<queue>
#include<math.h>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char a[2][10009];
int l,r,k,n,e,g,len;
int main()
{
    freopen("cyclic.in","r",stdin);freopen("cyclic.out","w",stdout);
    cin>>(a[0]+1);len=strlen(a[0]+1);
    scanf("%d",&n);
    g=1,e=0;
    for(int kk=1;kk<=n;kk++)
    {
        scanf("%d%d%d",&l,&r,&k);
        k=k%(r-l+1);
        int i=l,j=r-k+1;
        for(i,j;i<=l+k-1&&j<=r;i++,j++)
            a[g][i]=a[e][j];
        for(i;i<=len;i++)
            a[g][i]=a[e][i-k];
        for(int i=l;i<=r;i++)
            a[e][i]=a[g][i];        
    }
    for(int i=1;i<=len;i++)
        cout<<a[e][i];
    return 0;
} 
原文地址:https://www.cnblogs.com/CLGYPYJ/p/7248949.html