牛客練習賽31 D 神器大師泰茲瑞與威穆 STL,模擬 A
牛客練習賽31 D 神器大師泰茲瑞與威穆
https://ac.nowcoder.com/acm/contest/218/D
時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 262144K,其他語言524288K
64bit IO Format: %lld
題目描述
「只要我拉動繩線,你就得隨之起舞。」 ——泰茲瑞
泰茲瑞來到卡拉德許之後,由於他精湛的神器製造技術,可謂是過的如魚得水。這次,他為自己打造了一個編輯器,稱為威穆(Veim)。操作威穆時,有兩種模式,具體操作如下。
在 Normal Mode 下
- 按下 i :進入 Insert Mode 。
- 按下 f :緊接著一個小寫字母 char,若當前游標後(右)方有至少一個 char ,將游標移動到其所在位置,否則不移動。
- 按下 x :刪除當前游標所在位的字元,後面的字元均會前移一格。
- 按下 h :將游標向左(前)移動一格,若無法移動就不移動。
- 按下 l :將游標向右(後)移動一格,若無法移動就不移動。
- 若按下了其他字元:無任何效果。
在 Insert Mode 下
- 按下非 e 小寫字母 char :在游標當前位置前插入這個字母 char。
- 按下 e
(具體請見樣例)
現在泰茲瑞的威穆中已經寫入了一個字串 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 均由小寫拉丁字母組成。
分析
看完題目之後,意識到除了模擬別無他法,於是迅速暴力手寫完成,其中normal mode中的f比較迷,,看了半天才看懂,然後提交TLE QAQ
TLE程式碼:
1 #include <stdio.h> 2 #include <math.h> 3 #include <string.h> 4 #include <algorithm> 5 #include <iostream> 6 #include <string> 7 #include <time.h> 8 #include <queue> 9 #include <string.h> 10 #define sf scanf 11 #define pf printf 12 #define lf double 13 #define ll long long 14 #define p123 printf("123\n"); 15 #define pn printf("\n"); 16 #define pk printf(" "); 17 #define p(n) printf("%d",n); 18 #define pln(n) printf("%d\n",n); 19 #define s(n) scanf("%d",&n); 20 #define ss(n) scanf("%s",n); 21 #define ps(n) printf("%s",n); 22 #define sld(n) scanf("%lld",&n); 23 #define pld(n) printf("%lld",n); 24 #define slf(n) scanf("%lf",&n); 25 #define plf(n) printf("%lf",n); 26 #define sc(n) scanf("%c",&n); 27 #define pc(n) printf("%c",n); 28 #define gc getchar(); 29 #define re(n,a) memset(n,a,sizeof(n)); 30 #define len(a) strlen(a) 31 #define LL long long 32 #define eps 1e-6 33 using namespace std; 34 char s[100500],t[100500]; 35 int main() { 36 ss(s); 37 ss(t); 38 int sta = 0;//0是normal ,1是insert 39 int lens = len(s); 40 int lent = len(t); 41 int x = 0; 42 for(int i = 0; i < lent; i ++) { 43 if(sta == 0) { 44 if(t[i] == 'i') { 45 sta = 1; 46 } else if(t[i] == 'f') { 47 char c = t[i+1]; 48 for(int i = x+1; i < lens; i ++) { 49 if(s[i] == c) { 50 x = i; 51 break; 52 } 53 } 54 55 i ++; 56 } else if(t[i] == 'x') { 57 for(int i = x; i < lens; i ++) { 58 s[i] = s[i+1]; 59 } 60 lens --; 61 } else if(t[i] == 'h') { 62 if(x != 0) { 63 x --; 64 } 65 } else if(t[i] == 'l') { 66 if(x != lens-1) { 67 x++; 68 } 69 } 70 } else { 71 if(t[i] == 'e') { 72 sta = 0; 73 } else { 74 for(int i = lens+1; i >= x+1; i --) { 75 s[i] = s[i-1]; 76 } 77 s[x] = t[i]; 78 x ++; 79 } 80 } 81 //ps(s) pn 82 } 83 ps(s) pn 84 }
打過一遍之後對題目有很深的理解了,意識到用連結串列做比較輕鬆,因為中間存在一個游標,直接調整游標插入刪除速度很快,
But, But! But!! But!!!
不會list啊。。。。。。。。
絕望,,,,,自閉了。。。。。
現場學list:
https://www.cnblogs.com/lalalabi/p/5060210.html
https://www.cnblogs.com/loleina/p/5179677.html
https://blog.csdn.net/zhouzhenhe2008/article/details/77428743/
https://blog.csdn.net/amoscykl/article/details/80934961
然後掌握了基本用法之後在題目裡還有坑,
需要用到迭代器遍歷連結串列,在檢查的時候因為這個改了好多遍,,,還WA了一發,所以標紅:如果要遍歷檢查一定要新建一個迭代器!!!
然後順利AC
AC程式碼:
1 #include <stdio.h> 2 #include <math.h> 3 #include <string.h> 4 #include <algorithm> 5 #include <iostream> 6 #include <string> 7 #include <time.h> 8 #include <queue> 9 #include <string.h> 10 #include <list> 11 #define sf scanf 12 #define pf printf 13 #define lf double 14 #define ll long long 15 #define p123 printf("123\n"); 16 #define pn printf("\n"); 17 #define pk printf(" "); 18 #define p(n) printf("%d",n); 19 #define pln(n) printf("%d\n",n); 20 #define s(n) scanf("%d",&n); 21 #define ss(n) scanf("%s",n); 22 #define ps(n) printf("%s",n); 23 #define sld(n) scanf("%lld",&n); 24 #define pld(n) printf("%lld",n); 25 #define slf(n) scanf("%lf",&n); 26 #define plf(n) printf("%lf",n); 27 #define sc(n) scanf("%c",&n); 28 #define pc(n) printf("%c",n); 29 #define gc getchar(); 30 #define re(n,a) memset(n,a,sizeof(n)); 31 #define len(a) strlen(a) 32 #define LL long long 33 #define eps 1e-6 34 using namespace std; 35 list<char> l; 36 char s[100500],t[100500]; 37 int main(){ 38 //ss(s); 39 //ss(t); 40 cin >> s >> t; 41 int sta = 0;//0是normal ,1是insert 42 int lens = len(s); 43 int lent = len(t); 44 list<char>::iterator x; 45 //int x = 0; 46 x = l.begin(); 47 for(int i = 0; i < lens; i ++){ 48 l.insert(x,s[i]); 49 } 50 51 /*for(x = l.begin();x!=l.end();++x){ 52 cout<<*x; 53 }*/ 54 x = l.begin(); 55 for(int i = 0; i < lent; i ++){ 56 if(sta == 0){ 57 if(t[i] == 'i'){ 58 sta = 1; 59 }else if(t[i] == 'f'){ 60 char c = t[i+1]; 61 list<char>::iterator y; 62 x ++; 63 y = x; 64 x --; 65 for(;y!=l.end();++y){ 66 if(*y == c){ 67 x = y; 68 break; 69 } 70 } 71 i ++; 72 }else if(t[i] == 'x'){ 73 74 list<char>::iterator xx; 75 xx = x; 76 x++; 77 l.erase(xx); 78 79 //x = l.begin(); 80 }else if(t[i] == 'h'){ 81 if(x != l.begin()){ 82 x --; 83 } 84 }else if(t[i] == 'l'){ 85 if(x != l.end()){ 86 x++; 87 } 88 } 89 }else{ 90 if(t[i] == 'e'){ 91 sta = 0; 92 }else{ 93 l.insert(x,t[i]); 94 } 95 } 96 /*list<char>::iterator z; 97 for(z = l.begin();z!=l.end();++z){ 98 cout<<*z;p123 99 } 100 cout << endl;*/ 101 //ps(s) pn 102 } 103 //ps(s) pn 104 list<char>::iterator z; 105 for(z = l.begin();z!=l.end();++z){ 106 cout<<*z; 107 } 108 cout << endl; 109 }