链接:https://ac.nowcoder.com/acm/contest/218/D
来源:牛客网
题目描述
「只要我拉动绳线,你就得随之起舞。」 ——泰兹瑞
泰兹瑞来到卡拉德许之后,由于他精湛的神器制造技术,可谓是过的如鱼得水。这次,他为自己打造了一个编辑器,称为威穆(Veim)。操作威穆时,有两种模式,具体操作如下。
在 Normal Mode 下
- 按下 i :进入 Insert Mode 。
- 按下 f :紧接着一个小写字母 char,若当前光标后(右)方有至少一个 char ,将光标移动到其所在位置,否则不移动。
- 按下 x :删除当前光标所在位的字符,后面的字符均会前移一格。
- 按下 h :将光标向左(前)移动一格,若无法移动就不移动。
- 按下 l :将光标向右(后)移动一格,若无牛客11.16练习赛法移动就不移动。
- 若按下了其他字符:无任何效果。
在 Insert Mode 下
- 按下非 e 小写字母 char :在光标当前位置前插入这个字母 char。
- 按下 e :退出 Insert Mode(进入 Normal Mode)。
(具体请见样例)
现在泰兹瑞的威穆中已经写入了一个字符串 s 。接下去泰兹瑞进行了一波操作(按下了若干按键),他的按键序列为 t 。现给出 s 和 t ,求这波操作之后威穆内留下的字符串。
输入描述:
两行,第一行字符串 s ,第二行字符串 t 。
输出描述:
一行,威穆里最后留下的字符串。
示例1
输入
复制
applese
xfllhlia
输出
复制
pplaese
说明
- 初始时,字符串为 ,威穆处于 Normal Mode 。下划线表示光标所在位置。
- 第一步操作为 x ,删除当前光标所在位的字符,并且光标后移一格。字符串变为 。威穆仍处于 Normal Mode。
- 下一步操作为 f ,之后跟有一个字符 `l` 。光标后存在字符 `l` ,故移动到该位置。字符串变为 。威穆仍处于 Normal Mode。
- 下一步操作为 l ,光标后移一格。字符串变为 。威穆仍处于 Normal Mode。
- 下一步操作为 h ,光标前移一格。字符串变为 。威穆仍处于 Normal Mode。
- 下一步操作为 l ,光标后移一格。字符串变为 。威穆仍处于 Normal Mode。
- 下一步操作为 i ,威穆进入 Insert Mode。字符串仍为 。
- 下一步操作为 a ,而非 e ,故插入字符 a 。字符串变为 。
示例2
输入
复制
pppp
iaefpfpia
输出
复制
appapp
备注:
1 ≤ |s|, |t| ≤ 105
s, t 均由小写拉丁字母组成。
----------------------------------------------------
题意上面很清楚,就是通过子串的每一个字符操作主串也就是个模拟,
主串由vector存,删除插入 直接用STL 里的方法
但有两个坑(emmm,或许是我太急躁把没看清题)
意思 f 后若有一个 char 则在 主串光标后找第一个出现此 char 的位置,光标移到此处。
第一个就是插入完以后 光标 到插入位置的下一位
代码如下:
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
#include<vector>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1e5+5;
vector<char>s;
int flag=0;//初始为 Nor mode
int main(){
string ss;
string t;
cin>>ss;
int l=ss.size();//每次更新
for(int i=0;i<l;i++){
s.push_back(ss[i]);
}
cin>>t;
int p=0;
int len=t.size();
for(int k=0;k<len;k++){
if(!flag){
if(t[k]=='i'){
flag=1;
}
else if(t[k]=='f'){
int r=k+1;
if(r<=len-1){
char ch=t[r];
for(int j=p+1;j<l;j++){
if(s[j]==ch){
p=j;
break;
}
}
k++;
}
}
else if(t[k]=='x'){
s.erase(s.begin()+p);
l=s.size();
}
else if(t[k]=='h'){
if(p!=0) p--;
}
else if(t[k]=='l'){
if(p!=l-1) p++;
}
}
else{
if(t[k]=='e'){
flag=0;
}
else{
s.insert(s.begin()+p,t[k]);
p++;
l=s.size();
}
}
}
for(int i=0;i<s.size();i++){
cout<<s[i];
}
return 0;
}