题目描述
给定一个字符串 �S 和 �n 次操作,每次操作为以下 33 种形式之一:
-
< x
表示将 �S 向左循环移动 �x 位。例如:�����abcde 执行< 2
后变成 �����cdeab。 -
> x
表示将 �S 向右循环移动 �x 位。例如:�����abcde 执行> 2
后变成 �����deabc。 -
rev
表示将 �S 翻转。例如:�����abcde 执行rev
后变成 �����edcba。
求 �S 在依次执行这 �n 次操作后得到的字符串 �′S′。
输入格式
第一行一个字符串 �S。
第二行一个整数 �n。
接下来 �n 行,每行一个操作。
输出格式
一行一个字符串 �′S′,表示依次执行 �n 次操作后得到的字符串。
输入输出样例
输入 #1复制
abcde 3 > 2 rev < 2
输出 #1复制
aedcb
说明/提示
【样例 1 解释】
- 原字符串为 �����abcde;
- 第一次操作后,字符串变为 �����deabc;
- 第二次操作后,字符串变为 �����cbaed;
- 第三次操作后,字符串变为 �����aedcb。
【数据规模与约定】
记 ∣�∣∣S∣ 表示字符串 �S 的长度。
测试点编号 | 特殊性质 |
---|---|
1∼31∼3 | ∣�∣,�,�≤1000∣S∣,n,x≤1000 |
44 | 没有 rev 操作 |
55 | �=��...���...�S=aa...abb...b |
6∼106∼10 | 无 |
对于 100%100% 的数据,1≤∣�∣,�≤1061≤∣S∣,n≤106,0≤�≤1090≤x≤109,�S 仅由小写字母组成。
代码:
#include<bits/stdc++.h>
#include<string>
using namespace std;
char c[100];//[1000000010];
int main(){
string a,b;//,c;
int num;
// char c[5];
int i,j;
int n;
cin>>a;
//cout<<a<<endl;
cin>>n;
//cout<<n;
b=a;
int len1=a.length(),len2;
while(n--){
getchar();
num=0;
scanf("%[^\n]",c);//scanf("%c%c%s",&c[0],&c[1],&Num);//gets(c);
//cout<<c;
if(c[0]!='r'){//算出移动位数
len2=strlen(c);//c.length();
for(i=2;i<len2;i++)
num=num*10+c[i]-'0';
}
if(c[0]=='>'){//右移
if(num%len1==0) continue;//不用移动
for(i=len1-num%len1,j=0;i<len1;i++,j++){
b[j]=a[i];
}
for(i=0;i<len1-num%len1;j++,i++){
b[j]=a[i];
}
}
else if(c[0]=='<'){
if(num%len1==0) continue;
for(i=num%len1,j=0;i<len1;i++,j++){
b[j]=a[i];
}
for(i=0;i<num%len1;i++,j++){
b[j]=a[i];
}
}
else{
for(i=len1-1;i>=0;i--){
b[len1-1-i]=a[i];
}
}
a=b;
//cout<<b<<endl;
}
cout<<a;
}
疑问:
调试调到输入光标就停在那里,不知道干嘛……又不是数组开大了,设置了多个断点也不行
其实我感觉是可以的,应该没错吧,最多超时或者数组不够啥的,结果一个点也没过,也没测试数据啥的……
c++用不了gets(),dev那gets_s()也不行。然后移动位数也不一定是个位数
string类的话用不了字符串的函数
嗐,得认真一点了,之几天都在堆积问题,没有解决问题(光拉屎不递纸),花的时间也少,得好好学了,加油!