1. 程式人生 > >UVa11988 Broken Keyboard 損壞的鍵盤【list】

UVa11988 Broken Keyboard 損壞的鍵盤【list】

問題 put this space 損壞 Go include 光標移動 keyboard

題目鏈接:https://vjudge.net/problem/UVA-11988

題目大意:

鍵盤的home鍵和end鍵出現了問題。

在輸入一段文本時,home鍵或end鍵可能會自動被按下,home鍵會使光標移動到文章開頭,end鍵會使光標移動到文章結尾。

輸入包含多組數據,每組數據一行,包含不超過100000個字母,表示輸入文本。[表示home鍵按下,]表示end鍵按下。

對每組輸入輸出一行,表示你在顯示屏上看到的文本。

Sample Input This_is_a_[Beiju]_text [[]][][]Happy_Birthday_to_Tsinghua_University Sample Output
BeijuThis_is_a__text Happy_Birthday_to_Tsinghua_University stl 鏈表
#include <iostream>
#include <cstdio>
#include <string.h>
#include <list>
using namespace std;
char str[1000100];
int main()
{
    while(scanf("%s",str)!=EOF){
        list<char> l;
        list<char>::iterator p = l.begin();
        
int len = strlen(str); for(int i=0; i<len; i++){ if(str[i]==[)p = l.begin(); else if(str[i]==])p = l.end(); else l.insert(p, str[i]); } for(p = l.begin(); p!=l.end(); ++p)cout << *p; cout << endl; } return 0
; }

模擬鏈表

#include <iostream>
#include<string.h>
#include <algorithm>
using namespace std;
const int maxn = 100000 + 5;
 
char buf[maxn];
int Next[maxn];
 
int main(){
    int cur, last,n;
    while (scanf("%s", buf+1)!=EOF){
        n = strlen(buf + 1);
        cur = last = 0;
        for (int i = 1; i <= n; i++){
            if (buf[i] == [)cur = 0;    //house鍵
            else if (buf[i] == ])cur = last; //end鍵
            else{
                Next[i] = Next[cur];   //字符i的下一個位置為cur的下一個位置
                Next[cur] = i;         //curr的下一個位置為i
                //更新cur和last
                if (cur == last)last = i;   //cur等於i表示光標在顯示屏最後一個字符
                cur = i;  //移動光標
            }
        }
        Next[last] = 0;  //結束位置
        for (int i = Next[0]; i != 0; i = Next[i])
            printf("%c", buf[i]);
        printf("\n");
    }
    return 0;
}

2018-03-30

UVa11988 Broken Keyboard 損壞的鍵盤【list】