A,B,C水
D。
有一個串,長度為n+2,
現在知道他的所有n個 長度為3的子串是什麼
求出原始的串
這題跟POJ 2337有點像
最後抽象出的問題就是求歐拉通路:
將每個長度為3的子串, 前兩個字母(數字)看成一個結點, 後兩個字母(數字)看成一個結點,
然後這個子串就相當於 一條從前一個結點到後一個結點的邊
歐拉通路的要求就是所有邊都要走一遍, 所以最後就是求歐拉通路了
結點的個數最大為62*62,邊的數量顯然就是n了
因為兩個字母(數字)hash成數字的話也就是62*62種
首先要判斷這個歐拉通路是否存在
首先計算每個結點的入度和出度,
然後如果一個有向圖存在歐拉通路。
則任意結點的出度跟入度的差的絕對值 不大於1
並且統計abs(出度-入度)==1 的結點的數量,假設為x個
則x必然為0或者2
如果為0個,則歐拉通路在任意一點都可當做起點
如果為2個,則歐拉通路從(出度-入度)==1 的結點出發
求歐拉通路的時候我們dfs即可,每條邊會有一個編號,保證每條邊只走一次。
但是需要注意的是,這個n是有20萬的, 重邊和自環多了會出一些問題。
所以我就將重邊看成1條,但是對其計數,在dfs的時候用邊的數量當做是否訪問過的標記
#include
#include
#include
#include
#include
#include
#include
#include
E
題意是
給出n個區間。
然後第i個區間表示的是第i個左括號與右括號的 下標距離范圍
求出一個合法的括號序列 並且滿足這些范圍
然後後來想了想,貌似是個記憶化dp, 而且並不難。。
令dp[i][j]表示第i個到第j個左括號是否都成功的匹配到了右括號
那麼在dfs的時候,對於dp[i][j] , 我們枚舉i被第幾個右括號匹配了,顯然是從第i個右括號枚舉到第j個右括號,假設被第k個右括號匹配並且滿足之前給的范圍了
然後就可以去尋找其子狀態 dp[i + 1][k] 以及dp[k+1][j]
#include
#include
#include
#include
#include
#include
#include
#include