zoukankan      html  css  js  c++  java
  • 循环移动

    问题描述

    给出一个字符串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;
    } 
  • 相关阅读:
    php冒泡排序
    解决ubuntu下安装phpmyadmin访问不了的问题
    反省
    mysql主从复制
    ubuntu14.04 安装 bcm43142无线网卡
    mysql 批量更新和批量插入
    chromium 安装 pepper flash player
    js prototype新感悟
    读《乌合之众》
    马云---我的世界永不言败
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/7248949.html
Copyright © 2011-2022 走看看