小委出發vijos 1572 jdoj 1572

2022-05-01 23:24:13 字數 1306 閱讀 5485

小委出發

題目大意:乙個長度為n的字串,由(){}組成。求最長的和諧字串:我們對最長和諧字串的定義就是每乙個括號有乙個性質相同的括號與之匹配,這兩個括號中間要麼為空,要麼也是和諧的。幾個連續的和諧串連在一起也是和諧的。

注釋:k<=$5\cdot 10^6$

想法:開始的想法是dp,怎麼dp呢?我們設定dp[i]表示以第i個點為最後乙個點的最長和諧子串。顯然我們只需要記錄一下每乙個dp值的對應的位置即可,但是不好寫,特判有些多,我們用一種很強的方式來解決這個問題(鳴謝edward♂frog)。我們用棧維護。如何用棧進行維護呢?如果當前元素是左邊的括號,我就將其扔進棧裡。如果當前元素是右括號,我就將它和棧頂元素進行比較,如果它和棧頂元素可以匹配,我就將它們雙雙彈出棧,將這兩個元素的下標記為true,如果不是,我就清空棧。最後,從一到k每乙個數對應true或false。我們只需要求最長的true的序列。這樣為什麼是對的?如果當前元素和棧頂元素相等,那麼證明他們之間的元素是一定滿足條件後被彈出的。所以,我們將這兩個元素標記後,對於每乙個和諧子串都一定有一串連續的1。我們只需要求最長的連續的1即可......

最後,附上醜陋的**......

1 #include 2 #include 3 #include 4

using

namespace

std;

5int v[5000010];6

char s[5000010];7

int a[5000010];8

int x[5000010];9

int dp[5000010

];10

intmain()

11') a[i]=4;20

else

if(s[i]=='

]') a[i]=5;21

else a[i]=6;22

}23int top=0;24

for(int i=1;i<=k;i++)

2530

else

3138

else top=0;39

}40}41

for(int i=1;i<=k;i++)

4247}48

int maxk=1;49

int maxn=-1;50

for(int i=1;i<=k;i++)

5154

for(int i=maxk-maxn+1;i<=maxk;i++) printf("%c"

,s[i]);

55 }

小結:錯誤,最後維護可以用並查集,雖然沒必要

VI使用小技巧

1 替換某一字串 s old word new word g 在整個檔案中將old word替換為new word 2 不進入vi編輯器將檔案中的某一字串替換掉 sed s 111 aaa g 1.txt 2.txt 將1.txt中所有的111替換為aaa,修改後的檔案寫入2.txt sed s 1...

vi命令小總結

這篇去寫一些最近在工作中get到的關於vi vim命令的點,簡單去記錄下。在vi編輯檔案的時候,發現有時要刪除很多的檔案內容,這個時候去一點點刪除很慢,這裡get到了乙個快速刪除一行的技能。在開啟的檔案中所要刪除的行連續按兩次d就可以快速刪除一行,然後在用 wq儲存即可。有的時候我們在檢視乙個檔案之...

Vi常用小技巧

set nu 顯示行號 set nonu 取消顯示行號 shift g 最後一行 1 shift g 第一行 gg也行 ng n 為數字。移動到這個檔案的第 n 行 shift 4 行尾 0 行首 d158 刪除158行 dd 刪除當前一行 在一般模式之中,只要按下 i,o,a 等字元就可以進入輸入...