1. 程式人生 > >牛客練習賽31 D 神器大師泰茲瑞與威穆 STL,模擬 A

牛客練習賽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

:退出 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| ≤ 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 }