1. 程式人生 > >牛客小白D題(STL的迭代器)

牛客小白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{pp\underline{l}ese}
 。威穆仍處於 Normal Mode。
- 下一步操作為 l ,游標後移一格。字串變為
\mathtt{ppl\underline{e}se}
 。威穆仍處於 Normal Mode。
- 下一步操作為 h ,游標前移一格。字串變為
\mathtt{pp\underline{l}ese}
 。威穆仍處於 Normal Mode。
- 下一步操作為 l ,游標後移一格。字串變為
\mathtt{ppl\underline{e}se}
 。威穆仍處於 Normal Mode。
- 下一步操作為 i ,威穆進入 Insert Mode。字串仍為
\mathtt{ppl\underline{e}se}

- 下一步操作為 a ,而非 e ,故插入字元 a 。字串變為
\mathtt{ppla\underline{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 != '\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");
}