bupt -2016-4

4.字符串处理


问题描述

有以下三种操作。

(1)COPY l r(0<=l<=r<n),n代表s串的长度。这个表示将s串从l到r的序列复制到剪贴板t里面,覆盖t字符串。

例如s为abcde    t为pqr

执行COPY 1 2变为

s为abcde     t为bc

(2)CUT l r(0<=l<=r<n)n代表s串的长度。这个表示将s串从l到r的序列剪切到剪贴板t里面(删除s串中的l到r的序列),覆盖t字符串。

例如s为abcde    t为pqr

执行CUT 1 2变为

s为ade     t为bc

(3)PASTE p(0<=p<n),n代表s串的长度。这个表示将t串插入到s串p位置的后面。t保持不变。

例如s为abcde    t为pqr

执行PASTE 1 变为

s为abpqrcde      t为pqr


Input

输入正整数N,表示N例测试。首先给你s串,再给你一个m,然后给你m个操作

Output

对每个操作,输出操作后的s串


Sample Input

abcde

5

CUT  1 2

COPY 0 1

PASTE 1

PASTE 1

CUT  1 3


Sample Output

ade

ade

adade

adadade

aade


c++版  :博主葡萄家

#include<iostream>
#include <cstring>
#define N 1000
using namespace std;
int main (){
int l,r,m,p,i;
char s[N];
char t[N];
char temp[N];
char op[15];
int len1,len2;
while(cin>>s){
strcpy(t,"jkl");
cin>>m;
while(m--){
cin>>op;
if(0==strcmp(op,"COPY")){//COPY 操作
cin>>l>>r;
for(i=l;i<=r;i++){
temp[i-l]=s[i];
}
temp[r-l+1]='\0';
strcpy(t,temp);
cout<<s<<endl;
//cout<<t<<endl;
}
else if(0==strcmp(op,"CUT")){//CUT操作,学习该方法的使用,如何复制合并数组
cin>>l>>r;
for(i=l;i<=r;i++){
temp[i-l]=s[i];
}
temp[r-l+1]='\0';
strcpy(t,temp);
//cout<<t<<endl;
strcpy(temp,"");


len1=strlen(s);
len2=r-l+1;
for(i=0;i<l;i++){
temp[i]=s[i];
}
for(i=l;i<len1-len2;i++){
temp[i]=s[len2+i];
}
temp[i]='\0';
strcpy(s,temp);
cout<<s<<endl;
} else{
cin>>p;
len1=strlen(s);
len2=strlen(t);
for(i=0;i<=p;i++){
temp[i]=s[i];
}
for(i=p+1;i<=p+len2;i++){
temp[i]=t[i-p-1];
}
for(i=p+len2+1;i<len1+len2;i++){
temp[i]=s[i-len2];
}
    temp[i]='\0';
strcpy(s,temp);
cout<<s<<endl;
//cout<<t<<endl;
}
}

}

}

C语言版:

#include<stdio.h>
#include<string.h>
#define N 1000
int main (){
int l,r,m,p,i;
char s[N];
char t[N];
char temp[N];
char op[15];
int len1,len2;
while(scanf("%s",s)!=EOF){
strcpy(t,"jkl");
scanf("%d",&m);
while(m--){
scanf("%s",op);
if(0==strcmp(op,"COPY")){//COPY 操作
scanf("%d%d",&l,&r);
for(i=l;i<=r;i++){
temp[i-l]=s[i];
}
temp[r-l+1]='\0';
strcpy(t,temp);
printf("%s\n",s);
//cout<<t<<endl;
}
else if(0==strcmp(op,"CUT")){//CUT操作,学习该方法的使用,如何复制合并数组
scanf("%d%d",&l,&r);
for(i=l;i<=r;i++){
temp[i-l]=s[i];
}
temp[r-l+1]='\0';
strcpy(t,temp);
//cout<<t<<endl;
strcpy(temp,"");


len1=strlen(s);
len2=r-l+1;
for(i=0;i<l;i++){
temp[i]=s[i];
}
for(i=l;i<len1-len2;i++){
temp[i]=s[len2+i];
}
temp[i]='\0';
strcpy(s,temp);
printf("%s\n",s);
} else{
scanf("%d",&p);
len1=strlen(s);
len2=strlen(t);
for(i=0;i<=p;i++){
temp[i]=s[i];
}
for(i=p+1;i<=p+len2;i++){
temp[i]=t[i-p-1];
}
for(i=p+len2+1;i<len1+len2;i++){
temp[i]=s[i-len2];
}
    temp[i]='\0';
strcpy(s,temp);
printf("%s\n",s);
//cout<<t<<endl;
}
}

}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值