LOJ3049 十二省聯考 2019 字串問題

2022-09-10 13:51:14 字數 2263 閱讀 4496

題目傳送門

分析:最暴力的做法,a向可以控制的b連邊,b向以它為字首的a連邊

然後拓撲排序求一條路徑的最大值

複雜度\(o(n^2)\)

明顯要優化連邊,這裡給出兩種解法:

sam優化建邊:

這裡要字首關係,我們反向建sam將其變成字尾關係

對於每個串\([l,r]\),我們先找到\(r\)結尾的字首在sam上的位置,通過parent樹上倍增找到\([l,r]\)所在的endpos集合的點

對於每個parent樹上的點,維護乙個vector,儲存在這個點上的a和b

同乙個點上的a和b,先按len為關鍵字從小到大排序,再將b優先放前面,a優先放後面

每個點向它子串集合中最短的連邊,b向比他長的並且比下乙個b短的a連邊,parent樹父親集合中最長的串向兒子連邊

再把控制關係連上去

然後直接跑拓撲排序,時空複雜度都會從\(o(n^2)\)變成\(o(n)\)

寫起來細節挺多的有點噁心

字尾陣列+主席樹優化建邊:

我們先用原串跑一次字尾陣列

b是a的字首只需要\(min_^height[i]\geq len[b]\)

我們對於每個b,滿足上述關係的一定是乙個包含\(lb\)的區間

這個可以二分+\(o(1)\)rmq解決

然後線段樹優化建邊?不行

發現a的長度如果小於b就會出現問題

那就用主席樹

把子串長度從大到小排序,乙個乙個加入再優化建邊就可以了

然後把控制關係也加進去

跑拓撲排序,但是時空複雜度都是\(o(nlogn)\),很卡常

**是第一種做法的:

(字尾陣列是個好東西,我有頭髮的時候天天寫)

十二省聯考 貳 壹玖

之前大假期集訓的時候好像做過,但是已經忘了,可能是水過去的 做之前建議先做一下noi2010超級鋼琴,跟這道題的思路是一樣的 要求的是這若干個區間貢獻的前 k 大,不妨列舉每乙個左端點,用 rmq 超級鋼琴 或者可持久化 01trie 異或粽子 維護出貢獻最大的右端點,放到乙個大根堆裡,堆裡每個元素...

LOJ3048 十二省聯考 2019 異或粽子

小粽是乙個喜歡吃粽子的好孩子。今天她在家裡自己做起了粽子。小粽面前有 n 種互不相同的粽子餡兒,小粽將它們擺放為了一排,並從左至右編號為 1 到 n 第 i 種餡兒具有乙個非負整數的屬性值 a i 每種餡兒的數量都足夠多,即小粽不會因為缺少原料而做不出想要的粽子。小粽準備用這些餡兒來做出 k 個粽子...

十二省聯考2019 遊記

在機房呆了一天,大概看了看原先寫過的題,有點頹。下午的時候和大家一起打掃了一下機房。走的時候,看著空無一字的黑板,風吹起的棕黃色窗簾,遠方的藍色天空,有一種很濃厚的哀傷。時間過得真快啊,轉眼就是省選了呢。許是要退役了吧?許是要退役了吧。下午去試機了,感覺鍵盤不太星啊。考場倒是換了乙個地方 但是不讓我...