1. 程式人生 > >演算法競賽入門經典第二部分基礎篇

演算法競賽入門經典第二部分基礎篇

第6章資料結構和基礎

指標的連結串列實現方式是,當前節點的next指向下一個節點,用陣列模擬就是 for(int i=next[0];i!=0;i=next[i]) i=next[i];就是一條鏈。

你有一個破損的鍵盤。鍵盤上的所有鍵都可以正常工作,但有時Home鍵或者End鍵會自動按下。你並不知道鍵盤存在這一問題,而是專心打稿子,甚至連顯示器都沒開啟。當你開啟顯示器時之後,展現在你面前的是一段悲劇文字。你的任務時在開啟顯示器之前計算出這段悲劇文字。

輸入包含多組資料。每組資料佔一行,包含不超過100000個字母,下劃線,字元"["或者"]"。其中"["表示HOME,"]"表示END鍵。輸入結束標誌為檔案結束符(EOF)。

Sample Input

This_is_a_[Sample]_text
[[]][][]Nihao_I_am_a_Sample_Input
This_pr[oblem_has_a_100]0[m]s_time_limit
Maybe_theres_no_bracket

Sample Output

SampleThis_is_a__text
Nihao_I_am_a_Sample_Input
moblem_has_a_100This_pr0s_time_limit
Maybe_theres_no_bracket

以這個輸入為例。

ABC[DE]F

首先在ABC的時候,是按順序連結的 0->1->2->3

當遇到'['時,cur=0;所以 next[5]=next[0]; next[0]=5;這樣  順序就變成了 0->5->1->2->3; 然後到E這個字元,同樣 next[6]=next[5];next[5]=6; 這樣 順序變成了 0->5->6->1->2->3; 然後到']' 這時候 cur=last=3; 然後到了F; next[9]=next[3]; next[3]=9; 這樣 最後的順序為 0->5->6->1->2->3->9; 這也是最後的列印順序,注意 開頭的0只是個開始,對應指標表示裡的頭指標,它本身不代表任何字元 因為s[0]不代表字元,s是從1開始的有字元。當然,與連結串列一樣 這個0可以有,沒有也行,如果不從0開頭 就需要設next[1]=0;然後,最後單獨列印s[1];

核心就是 next[i]=next[cur]相當於指標建立中的 p->next=*L->next;(一個是讓next[i]=0,一個是讓p->next=NULL) next[cur]=i 相當於指標建立中的 *L->next=p;(一個讓cur->i 一個讓L的next->p)