1. 程式人生 > >例題6-4 破損的鍵盤 UVa 11988

例題6-4 破損的鍵盤 UVa 11988

題意:字元'['表示句首,就是游標移到了句首,’】‘表示句尾

法一:用連結串列模擬游標移動

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>

using namespace std;

const int maxn=100005;
int last,cur,next[maxn];
char s[maxn];
int main()
{
    //freopen("f.txt","r",stdin);
    while(scanf("%s",s+1)==1){
        int n=strlen(s+1);
        last=cur=0;
        next[0]=0;
        for(int i=1;i<=n;i++){
            char ch=s[i];
            if(ch=='[')cur=0;
            else if(ch==']')cur=last;
            else{
                next[i]=next[cur];
                next[cur]=i;
                if(cur==last)last=i;
                cur=i;
            }
        }
        for(int i=next[0];i!=0;i=next[i]){
            printf("%C",s[i]);
        }
        printf("\n");
    }
    return 0;
}

法二:這題看到有人用雙端佇列,把[加入隊首,】加入隊尾,再按照佇列中的順序輸出
#include <iostream>
#include <string>
#include <vector>
#include <cstdio>
#include <deque>
using namespace std;
char str[100010];
int main(){
   // freopen("f.txt","r",stdin);

    while(scanf("%s",str)!=EOF){
        deque<int > q;
        int i=0;
        while(str[i]=='['||str[i]==']')  i++;
        q.push_front(i);
        while(str[i]){
            if(str[i]=='['){
                 q.push_front(i+1);
                 str[i]='\0';
            }
            else if(str[i]==']'){
                 q.push_back(i+1);
                 str[i]='\0';
            }
            i++;
        }
        while(!q.empty()){
            printf("%s",str+q.front());
            q.pop_front();
        }
        printf("\n");

    }
    return 0;
}

法三:

分析:給出的一行文字,從後往前看,如果遇到】,那麼】後面的字串一定在最後,後面的字串一定在最前,再往前移動還是這樣的規律,所以這題可以用遞迴解決;

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>

using namespace std;

char buf[100001];
void dfs(int l, int r)
{
	int s = r;
	while (s >= l && buf[s] != '[' && buf[s] != ']') s --;
	if (buf[s] == ']') dfs(l, s-1);
	for (int i = s+1 ; i <= r ; ++ i)
		printf("%c",buf[i]);
	if (buf[s] == '[') dfs(l, s-1);
}

int main()
{
   // freopen("f.txt","r",stdin);
	while (gets(buf)) {
		dfs(0, strlen(buf)-1);
		printf("\n");
	}
    return 0;
}


相關推薦

例題6-4 破損鍵盤(又名:悲劇文本)(Broken Keyboard,UVa 11988)—靜態鏈表

else if strlen 靜態鏈表 尾插 指向 第一個元素 內容 其中 分享 問題描述: 你有一個破損的鍵盤。鍵盤上所有的鍵都可以正常工作,但有時候Home鍵或者End鍵會自動按下。你並不知道鍵盤存在這一問題,而是專心打稿子,甚至連顯示器都沒打開。當你打開

例題6-4 破損鍵盤 UVa 11988

題意:字元'['表示句首,就是游標移到了句首,’】‘表示句尾 法一:用連結串列模擬游標移動 #include <algorithm> #include <iostream> #include <cstdlib> #include <

紫書例題6-4 UVa 11988 ( 連結串列

用陣列模擬連結串列 ,以前只用過指標模擬,陣列方便了不少啊 沒什麼好說的(不是很理解啊 先記錄一下唉2 /*一直不知道我HOME與end作用 所以一直沒有理解題意QAQ */ /* 題意就是隻要出

鏈表-破損鍵盤 Uva 11988

str pan 數組模擬鏈表 光標 while i++ 鏈表 字符 clas #include<cstdio> #include<cstring> const int maxn=100000+5; int last,cur,next[maxn];

例題6-2(Rails, UVa 514)

using view 存儲 st表 get problem body closed 分享 題目鏈接 給定入棧順序,問能否以給出的順序出棧。 眾所周知,棧的特點是先入後出。 此特點在該題中體現為對於當前需要出棧的元素(要想先出),必須

演算法競賽入門經典第六章例題6-1 Concurrency Simulator UVA

#include<iostream> #include<string> #include<deque> #include<vector> #inclu

【演算法競賽入門經典】例題6-4 uva11988

題目連結 題意 你在用鍵盤打字,但是“home”和“end”鍵會是不是自動按下,“home”會使游標移動到文字開頭,“end”會使游標移動到文字最後。你打字時沒開顯示器,當你開啟顯示器後,呈現在你眼前的是一段悲劇的文字。 輸入包含多組資料,每組資料

UVa 11988破損鍵盤

這題是很好的學習用陣列實現連結串列的例子. 原題連結 UVa11988 題意 輸入一段文字,字元’[‘表示Home鍵,’]’表示End鍵。輸出螢幕上面的結果。 思路 難點在於在字串的頭和尾插

UVa 11988 破損鍵盤 連結串列 雙向佇列

連結串列解決 用陣列頻繁的移動元素效率較低,用連結串列 較好。 #include<iostream> #include<cstdio> #include<cstring

連結串列-單向連結串列&&UVa 11988 Broken Keyboard(a.k.a.Beijiu Text)(破損鍵盤(悲劇文字))的理解與解析

連結串列-單向連結串列&&UVa 11988 Broken Keyboard(a.k.a.Beijiu Text)(破損的鍵盤(悲劇文字)) C++最新的2011標準C++1

例題 6-21 UVA - 506】System Dependencies

ack ring names cnblogs name ret any fin || 【鏈接】 我是鏈接,點我呀:) 【題意】 在這裏輸入題意 【題解】 記錄每個物品它的依賴有哪些,以及它被哪些東西依賴就可以了。 顯式安裝的東西不能被隱式刪除刪掉(就是rem

UVa 679 例題6-6 小球下落(Dropping Balls)

題目大意: 有一顆滿二叉樹,每個節點是一個開關,初始全是關閉的,小球從頂點落下,小球每次經過開關就會把它的狀態置反,現在問第k個球下落到d層時經過的開關編號。 解題思路: 這道題一開始看的時候,感

紫書例題6-3 (UVa 442)

for lse cout 例題 gif src cstring opened ble 題目地址:https://vjudge.net/problem/UVA-442 題目大意:汗顏,其實我是直接看紫書的中文題意的,大意就是計算兩個矩陣乘法次數,設計線性代數知識,可自己百

例題6-2 UVA 514

挺好的一道題目,想樣例程式碼也想了很久。 大體思路: 整體分為兩個過程,從A到C,從C到B, 用A代表要從A到C的編號序列,肯定是1到n了, 用B代表最終在B的車的編號。 讓A = 1,B = 1,B是最終車輛的陣列索引。 開始迴圈,發現A中的車等於B中的車,則說明了,這輛

【棧】例題6-2 UVa 514

/* 演算法競賽入門 LRJ 例題6-2(UVa 514)Rails */ #include<iostream> #include<cstdio> #include<

刷紫書第三章例題例題3-4,3-5,3-6

例題3-4 Master-Mind Hints UVA - 340 MasterMind is a game for two players. One of them, Designer, selects a secret code. The other, B

《物聯網框架ServerSuperIO教程》-19.設備驅動和OPC Client支持mysql、oracle、sqlite、sqlserver的持久化。v3.6.4版本發布

sql 數據庫名 http oracle mongod 文件 https bapi 開發 19.設備驅動和OPC Client支持mysql、oracle、sqlite、sqlserver的持久化 19.1 概述 ServerSuperIO支持設備驅動

Appium 1.6.4 環境搭建流程(Java, Android+IOS, Windows+Mac)

經典 客戶 dev utf-8 4.6.1 新版本 -m works odi Appium1.6.4已經出來一段時間了,快速給大家串一下怎麽搭建,貼了下載鏈接 1 基礎環境: Windows + Mac: Java JDK 1.8+ (需配置環境變量),Appium1

4.6.4 白盒測試(第二部分)

6.4 png image log nbsp src -128 logs 4.6 4.6.4 白盒測試(第二部分)

2017-6-4 用jQuery 做大圖輪播

length move val orm fun margin window blog cli <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_De