Problem
給一個 SOAP 的回應格式,解析給定的回應,並且提供屬性查找。
Sample Input
|
|
Sample Output
|
|
Solution
SOAP 類似 HTML XML 那種,在不少網路上的諮詢服務都會有這一套規則。
不過看到這一道題目很簡單,保證輸入格式一定可以相互匹配且完整,那使用遞迴 parsing 輸入,建造一個 tree 出來,同時子樹不會出現相同的命名。
建造樹出來之後,詢問就沿著樹走訪即可。
|
|
給一個 SOAP 的回應格式,解析給定的回應,並且提供屬性查找。
|
|
|
|
SOAP 類似 HTML XML 那種,在不少網路上的諮詢服務都會有這一套規則。
不過看到這一道題目很簡單,保證輸入格式一定可以相互匹配且完整,那使用遞迴 parsing 輸入,建造一個 tree 出來,同時子樹不會出現相同的命名。
建造樹出來之後,詢問就沿著樹走訪即可。
|
|
請問在 base 下,指定 score 的數字有多少個。
|
|
|
|
首先,可以知道每一次增加的總數最多為 (base - 1) (base - 1),因此我們的狀態紀錄之少要追溯到當前分數 n - (base - 1) (base - 1)。
然而由於 score 過大,不可直接著手 dp[score][tail_digit]
之類的 dp 計算。仍可以計算於 (base - 1) * (base - 1) 以下的情況。
接著,利用遞迴公式 (線性變換矩陣 ?),每一項為 a[score][tail_digit]
,而分數必須保留到當前 score - (base - 1) * (base - 1)
,因此狀態將會有 (base - 1) * (base - 1) * base
,也就是矩陣最大上限 5 * 5 * 6 = 150
。
矩陣的部分,可以假想每一次在尾數多增加一個 digit 上去,而在初始項部分仍必須依靠 dp 去計算。矩陣快速乘法直接套用 D&C 在 O(n^3 log k)
完成,並且計算時,盡可能將無用的 0 忽略計算,否則很容易 TLE。
|
|
給一張圖 (有向圖),請問從起始點走到特定點的路徑,花費 / 經過邊數
最小值為何?
並且最多經過 1000 條邊 (含),邊可以重複走。
|
|
|
|
如果沒有限制最多經過的邊,將會相當難辦事,因為一直繞就可以將平均值拉下,而會繞多久可能要玩一下環狀收斂,最小平均環,然後檢查是否會經過這個環抵達目的地 …
當然這一題已經給定最大使用邊數,定義狀態為 dp[i][j]
使用 j 條邊抵達目的地 i 的最小花費。按照 spfa 的精神不斷更新即可。
|
|
把每一種牌當作字串串在一起,請問第 k 小字典順序的排列為何?並且相同數字 (rank) 的牌不能放在一起。
|
|
|
|
題目最麻煩的地方是 k 必須使用 long long
才裝得下,然而中間運算過程中很容易超過 long long
因此在終止條件上會變得很難處理。
首先我們必須要知道那些牌可以排出哪幾種方法,但是很明顯地基礎的 dp 無法用上,少說狀態也必須是 13 * 2^50
之類的玩相鄰不可同色。
因此最後將牌壓縮成,擁有 4 張一樣、3 張、2 張、1 張的個數,擁有多少種排列方式。在寫遞迴的時候,標記上一次使用哪一類型的牌。為了逃出 overflow 的運算,使用一個 double 類別的輔助陣列,同樣計算方法數。
隨後知道固定類型的方法數,依序從字典順序小的開始窮舉是否要擺放於此位置。
|
|
找一個生成樹,使得最大邊與最小邊的差最小。
|
|
|
|
窮舉最小邊權重使用,使用 kruscal 找到瓶頸的最大邊。
|
|
包裹放置於架子上時,盡可能讓兩側的總量越重越好,而中間放置輕的物品。
找到一種放置方式,同時字典順序越小越好。
|
|
|
|
很明顯地可以使用貪心策略,每一次決定方最左或者是最右邊的項目。
由於要維持最小字典順序,放置兩個物品時
|
|
|
|
|
|
直接每一行每一行搜索,過程中預處理所有因數分解,並且同時剪枝不合法的列。
|
|
給予一堆相同長度的 ATCG 構成的基因,找一段字典順序最小的基因,使得與給定的基因漢明碼距離(有多少位置不同)總和最小。
|
|
|
|
對於每一個位置,找到字符使用最多次的使用,這樣將可以將此位置的漢明碼距離縮到最短。
最後討論一下相同時所需要的最小字典順序,即可完成。
|
|
找一個數字 M 介於 [A, B]
之間,且中間的 substring 包含 N 的個數為何。
|
|
|
|
建立一個 AC 自動機,使用傳統的 AC 自動機 dp,每一個節點當作一般 AC 自動機的走訪,並且猜測下一步的所有匹配符號。
為了要卡住上限,增加經過的狀態是否一直為前幾次臨界上限,若一直在上限,則搜索範圍將會被限制。
|
|
這題十分直接,就是要你計算兩個很大的數字的乘積。
|
|
|
|
快速傅立葉 FFT 對我來說也是一知半解,但是我能知道他計算旋積可以在 O(n log n)
完成 n 個答案結果。
旋積計算就是對於維度為 n 的兩個向量,相互作內積,其中一個向量不斷地作 rotate shift right 的操作,因此會有 n 個內積結果。
如果要套用在這一題,相當於操作多項式乘法的計算,舉個例子來說
123 x 456
相當於下面兩個向量作旋積
|
|
如此類推,不過 FFT 只能使用 double 運算,因此在儲存精度上不是很好拿捏,誤差大概在 1e-1 ~ 1e-2 之間。
感謝 liouzhou_101 的誤差指導
|
|