神器大师泰兹瑞与威穆

链接: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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值