牛客小白D题(STL的迭代器)

「只要我拉动绳线,你就得随之起舞。」          ——泰兹瑞


       泰兹瑞来到卡拉德许之后,由于他精湛的神器制造技术,可谓是过的如鱼得水。这次,他为自己打造了一个编辑器,称为威穆(Veim)。操作威穆时,有两种模式,具体操作如下。

Normal Mode
- 按下 i :进入 Insert Mode
- 按下 f :紧接着一个小写字母 char,若当前光标后(右)方有至少一个 char ,将光标移动到其所在位置,否则不移动。
- 按下 x :删除当前光标所在位的字符,后面的字符均会前移一格。
- 按下 h :将光标向左(前)移动一格,若无法移动就不移动。
- 按下 l :将光标向右(后)移动一格,若无法移动就不移动。
- 若按下了其他字符:无任何效果。

Insert Mode
- 按下非 e 小写字母 char :在光标当前位置前插入这个字母 char。
- 按下 e :退出 Insert Mode(进入 Normal Mode)。 

       (具体请见样例)
       现在泰兹瑞的威穆中已经写入了一个字符串 s 。接下去泰兹瑞进行了一波操作(按下了若干按键),他的按键序列为 t 。现给出 s 和 t ,求这波操作之后威穆内留下的字符串。

输入描述:

两行,第一行字符串 s ,第二行字符串 t 。

输出描述:

一行,威穆里最后留下的字符串。
示例1

输入

复制
applese
xfllhlia

输出

复制
pplaese

说明

- 初始时,字符串为 
mathtt{underline{a}pplese}
,威穆处于 Normal Mode 。下划线表示光标所在位置。
- 第一步操作为 x ,删除当前光标所在位的字符,并且光标后移一格。字符串变为
mathtt{underline{p}plese}
 。威穆仍处于 Normal Mode。
- 下一步操作为 f ,之后跟有一个字符 `l` 。光标后存在字符 `l` ,故移动到该位置。字符串变为
mathtt{ppunderline{l}ese}
 。威穆仍处于 Normal Mode。
- 下一步操作为 l ,光标后移一格。字符串变为
mathtt{pplunderline{e}se}
 。威穆仍处于 Normal Mode。
- 下一步操作为 h ,光标前移一格。字符串变为
mathtt{ppunderline{l}ese}
 。威穆仍处于 Normal Mode。
- 下一步操作为 l ,光标后移一格。字符串变为
mathtt{pplunderline{e}se}
 。威穆仍处于 Normal Mode。
- 下一步操作为 i ,威穆进入 Insert Mode。字符串仍为
mathtt{pplunderline{e}se}

- 下一步操作为 a ,而非 e ,故插入字符 a 。字符串变为
mathtt{pplaunderline{e}se}
示例2

输入

复制
pppp
iaefpfpia

输出

复制
appapp

备注:

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 != '
'){
        ss.push_back(c);
    }
    bool flag = 1;
    list<char>::iterator it = ss.begin();
    while (c = getchar(), c != '
')
    {
        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("
");
}
原文地址:https://www.cnblogs.com/ALINGMAOMAO/p/9974185.html