牛客小白D題(STL的迭代器)
阿新 • • 發佈:2018-11-17
「只要我拉動繩線,你就得隨之起舞。」 ——泰茲瑞
泰茲瑞來到卡拉德許之後,由於他精湛的神器製造技術,可謂是過的如魚得水。這次,他為自己打造了一個編輯器,稱為威穆(Veim)。操作威穆時,有兩種模式,具體操作如下。
在 Normal Mode 下 - 按下 i :進入 Insert Mode 。
- 按下 f :緊接著一個小寫字母 char,若當前游標 後(右)方
- 按下 x :刪除當前游標所在位的字元,後面的字元均會前移一格。
- 按下 h :將游標向左(前)移動一格,若無法移動就不移動。
- 按下 l :將游標向右(後)移動一格,若無法移動就不移動。
- 若按下了其他字元:無任何效果。
在 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| ≤ 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"); }