循环移动

问题描述

给出一个字符串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;
} 
复制代码

 

posted @   浪矢-CL  阅读(532)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示