题目
BUPT 2016 计算机 ProblemD
有以下三种操作。
(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
输入描述
多组测试数据。
首先给你s串,再给你一个m,然后给你m个操作。
输出描述
对每个操作,输出操作后的s串。
示例
输入
abcde
5
CUT 1 2
COPY 0 1
PASTE 1
PASTE 1
CUT 1 3
输出
ade
ade
adade
adadade
aade
题解
这很北邮,出过好几次string的题了,这道题主要用的函数有三个:substr() , erase() 和 insert(),就按照他说的调用相应的库函数就好了,很简单
#include<iostream>
#include<string>
using namespace std;
int main()
{
int n;
string s;
while(cin>>s)
{
cin>>n;
string t,cmd;//t代表剪贴板
for(int i=0;i<n;i++)
{
cin>>cmd;
int l,r;
if(cmd=="CUT")
{
scanf("%d%d",&l,&r);
t=s.substr(l,r-l+1);//取剪切的子串放入t
s=s.erase(l,r-l+1);//s删除剪切的部分
}
else if(cmd=="COPY")
{
scanf("%d%d",&l,&r);
t=s.substr(l,r-l+1);//取剪切的子串放入t
}
else
{
scanf("%d",&l);
s=s.insert(l+1,t);//insert默认插入在pos前,+1才能插入到pos后
}
cout<<s<<endl;
}
}
}
小结
insert()还不太熟,在这里记录一下
只写了最简单最常用的用法,怕看多了该乱了
insert()用法
重点记一下这个pos代表什么,口诀:下标前个数后
s="012345";
//在s[2]前面插入"iii",也可以想成在第2个字符后面插入"iii"
s.insert(2,"iii");//s="01iii2345"