VI编辑器是Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器。
不过HK总是觉着VI用着不舒服,所以他想做一个自己的编辑器,命名为VI++。
它使用命令的方式执行操作。每个操作命令按照操作名或者操作名+操作参数的形式给出。
HK要实现的操作有以下一些。
- insert i A 把字符串A加到下标i的位置。例如,原来的串为abc,insert 2 bc后就变成了abbcc。
- double 把原字符串复制一遍加到串尾。例如,原来的串为abc,double后就变成了abcabc。
- delete i j 删除字符串下标为i到下标j之间的字符(包括i和j)。例如,原来的串为abc,delete 2 2后就变成了ab。
- change i j 把在字符串中下标为i和下标为j的字符交换,字符串的下标是从0开始的。例如,原来的串为abcd,change 0 2 后就变成了cbad。
- reverse 把字符串反转。例如,原串为abc,reverse后就变成了cba。
- rotate k 把字符串旋转k次。一次旋转定义为把首字母取出后放到字符串最后一位。例如,对abcde执行rotate 1 后就变成了bcdea,对abcde执行rotate 2后就变成了cdeab,以此类推。
对于每一个操作,应该输出其执行后的字符串。
当然,一个好的编辑器应该是可以识别和提示错误的。
如果有以下的情况的时候会出现提示错误:
- 空串的时候执行double,delete,change,reverse,rotate;
- 执行insert k A时候,k小于0或者k大于串的长度;
- 当执行change,delete操作的时候,不存在对应下标的字符。如字符串为abcd时,执行change 1 4,由于字符串中没有下标为4的字符,故出现错误。
出现错误的时候,只在屏幕上输出error,对原串不执行操作。
所有下标从0开始。
Input
输入数据第1行为操作数N(1<=N<=30),代表了后面有N个对字符串的操作。
第2行为初始字符串(可以包含空格并可能为空串)。
第3行到N+2行,每一行都有一个字符串,代表相应的操作,包含操作名和操作参数(如果有),每个操作字符串保证格式合法。
初始字符串和中间过程的字符串长度都不会超过100。
每个操作中如果含有字符串参数,则一定不含空格。
Output
在每一个操作后输出对应操作的结果或者错误提示信息。
Sample Input
6 abcde double rotate 4 reverse insert 1 abc delete 4 3 change 7 8
Sample Output
abcdeabcde eabcdeabcd dcbaedcbae dabccbaedcbae dabbaedcbae dabbaedbcae
简单模拟题,要注意空串也是能够插入的
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; char str[1000],work[1000],add[1000]; void Insert(int pos) { int i,len,len1; len = strlen(add); len1 = strlen(str); for(i = len1-1;i>=pos;i--) str[i+len] = str[i]; for(i = pos;i<pos+len;i++) str[i] = add[i-pos]; str[len1+len] = '\0'; printf("%s\n",str); } void Double() { int len = strlen(str),i; for(i = len;i<len*2;i++) str[i] = str[i-len]; str[len*2] = '\0'; printf("%s\n",str); } void Delete(int from,int to) { int i,len = to-from+1; int l = strlen(str); for(i = from;i<l;i++) { str[i] = str[i+len]; } str[l-len] = '\0'; printf("%s\n",str); } void Change(int i,int j) { char t; t = str[i]; str[i] = str[j]; str[j] = t; printf("%s\n",str); } void Reverse() { int len = strlen(str),i; char t; for(i = 0;i<len/2;i++) { t = str[i]; str[i] = str[len-1-i]; str[len-1-i] = t; } printf("%s\n",str); } void Rotate(int k) { int len = strlen(str),i; // k = k%len; while(k--) { char t = str[0]; for(i = 1;i<len;i++) str[i-1] = str[i]; str[len-1] = t; } printf("%s\n",str); } int main() { int T,len; while(~scanf("%d%*c",&T)) { gets(str); while(T--) { len = strlen(str); scanf("%s",work); if(!strcmp(work,"insert")) { int pos; scanf("%d%*c",&pos); gets(add); if(pos<0 || pos>len) { printf("error\n"); continue; } Insert(pos); } else if(!strcmp(work,"double")) { if(!len) { printf("error\n"); continue; } Double(); } else if(!strcmp(work,"delete")) { int from,to,t; scanf("%d%d",&from,&to); if(from>to) { t = from; from = to; to = t; } if(!len || from<0 || from>=len || to<0 || to>=len) { printf("error\n"); continue; } Delete(from,to); } else if(!strcmp(work,"change")) { int from,to,t; scanf("%d%d",&from,&to); if(from>to) { t = from; from = to; to = t; } if(!len || from<0 || from>=len || to<0 || to>=len) { printf("error\n"); continue; } Change(from,to); } else if(!strcmp(work,"reverse")) { if(!len) { printf("error\n"); continue; } Reverse(); } else if(!strcmp(work,"rotate")) { int k; scanf("%d",&k); if(!len) { printf("error\n"); continue; } Rotate(k); } } } return 0; }