列表

详情


XM33. 小明的字符串

描述

小明同学需要对一个长度为 N 的字符串进行处理,他需要按照要求执行若干步骤,每个步骤都均为下面 2 种操作中的一种,2 种操作如下:
TYPE 1. 从字符串结尾开始算起,将第 X 个字符之前的字符移动到字符串末尾
TYPE 2. 输出字符串索引为 X 的字符
小明尝试了很久没能完成,你可以帮他解决这个问题吗?

输入描述

第一行,包含两个整数,字符串的长度 N 和操作次数T;
第二行为要操作的原始字符串;

之后每行都是要执行的操作类型 TYPE 和操作中 X 的值,均为整数。

输入范围:
字符串长度 N:1 <= N <= 10000
操作次数 T:1 <= T <= 10000
操作类型 TYPE:1 <= TYPE<= 2
变量 X:0 <= X < N

输出描述

操作的执行结果

示例1

输入:

6 2
xiaomi
1 2
2 0

输出:

m

原站题解

C++ 解法, 执行用时: 4ms, 内存消耗: 508KB, 提交时间: 2020-07-19

#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;

const int maxn(1e4 + 5);
char root[maxn << 1];

int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    scanf("%s", root);
    memcpy(root + n, root, n);
    int head = 0, tail = n;
    int op, x;
    while(m--) {
        scanf("%d%d", &op, &x);
        if(op == 1) {
            head = (tail - x + n) % n;
            tail = (head + n) % (2 * n);
        }
        else if (op == 2) {
            printf("%c\n", root[(head + x) % n]);
        }
    }
    return 0;
}

C 解法, 执行用时: 5ms, 内存消耗: 388KB, 提交时间: 2021-08-18

#include <stdio.h>

int main(void)
{
    int n,t;
    char str[10001] = {0};
    scanf("%d",&n);
    scanf("%d",&t);
    scanf("%s",str);
     int cur =0;
    while(t--)
    {
        int tpye=0,x = 0;
        scanf("%d",&tpye);
        scanf("%d",&x);
       
        if(tpye == 1)
        {
            cur = cur-x;
            //printf("%d\n",cur);
            if(cur<0)cur= cur+n;
            //printf("%d\n",cur);
        }
        else
        {
            //printf("%d\n",cur);
           // printf("%d\n",cur + x);
            printf("%c\n",str[(cur + x)%n]);    
        }
    }
    
}

上一题