「只要我拉动绳线,你就得随之起舞。」 ——泰兹瑞
泰兹瑞来到卡拉德许之后,由于他精湛的神器制造技术,可谓是过的如鱼得水。这次,他为自己打造了一个编辑器,称为威穆(Veim)。操作威穆时,有两种模式,具体操作如下。
在 Normal Mode 下
- 按下
i :进入
Insert Mode 。
- 按下 f :紧接着一个小写字母 char,若当前光标 后(右)方有至少一个 char ,将光标移动到其所在位置,否则不移动。
- 按下 x :删除当前光标所在位的字符,后面的字符均会前移一格。
- 按下 h :将光标向左(前)移动一格,若无法移动就不移动。
- 按下 l :将光标向右(后)移动一格,若无法移动就不移动。
- 若按下了其他字符:无任何效果。
- 按下 f :紧接着一个小写字母 char,若当前光标 后(右)方有至少一个 char ,将光标移动到其所在位置,否则不移动。
- 按下 x :删除当前光标所在位的字符,后面的字符均会前移一格。
- 按下 h :将光标向左(前)移动一格,若无法移动就不移动。
- 按下 l :将光标向右(后)移动一格,若无法移动就不移动。
- 若按下了其他字符:无任何效果。
在 Insert Mode 下
- 按下非 e 小写字母 char :在光标
当前位置前插入这个字母 char。
- 按下 e :退出 Insert Mode(进入 Normal Mode)。
- 按下 e :退出 Insert Mode(进入 Normal Mode)。
(具体请见样例)
现在泰兹瑞的威穆中已经写入了一个字符串 s 。接下去泰兹瑞进行了一波操作(按下了若干按键),他的按键序列为 t 。现给出 s 和 t ,求这波操作之后威穆内留下的字符串。
输入描述:
两行,第一行字符串 s ,第二行字符串 t 。
输出描述:
一行,威穆里最后留下的字符串。
示例1
说明
- 初始时,字符串为
,威穆处于 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 。字符串变为
。
备注:
1 ≤ |s|, |t| ≤ 10
5
s, t 均由小写拉丁字母组成。
有点尴尬,当时写了一个双向链表。然后,赛后,用STL写写就过了。
#include<cstdio> #include<list> #include<stdio.h> using namespace std; list<char>ss; int main() { char c; while (c = getchar(), c != '\n'){ ss.push_back(c); } bool flag = 1; list<char>::iterator it = ss.begin(); while (c = getchar(), c != '\n') { if (flag) { switch (c) { case 'i':{flag = 0; } break; case 'f':{ char x = getchar(); list<char>::iterator ki = ++it; --it; for (; ki != ss.end(); ++ki){ if (*ki == x){ it = ki; break; } } } break; case 'x':{ss.erase(it++); } break; case 'h':{--it; if (it == ss.end())++it; } break; case 'l':{++it; if (it == ss.begin())--it; } break; default: break; } } else{ if (c == 'e')flag = 1; else{ ss.insert(it, c); } } } for (list<char>::iterator it = ss.begin(); it != ss.end(); ++it) { printf("%c", *it); } printf("\n"); }