【find】 字符串?樹狀數組~

     一道吐血的字符串題。
       題目大意是:給定n(n<=50000)個字符串,長度不超過100,同時給出q(q<=50000)個詢問,一個詢問包括兩個字符串
a,b,問一開始給出的n個字符串中,有多少個字符串,滿足它的前綴是a,後綴是b。
        考場上看到題目註釋了一句:字符串的公共前綴較少,所以很happy打了個猥瑣方法,先把n個字符串按照字典序排序,用二分縮小枚舉範圍,結果,每個數據都給了一堆length(a)=1 or length(b)=1的詢問(#.#)..........
       考試後把各種沾得上邊的東西全想了一下(包括字典樹套字典樹,字典樹套線段樹,網絡流加離線回答.......這寫噁心東西),
當得知solution 給出的樹狀數組的時候,被無語到了.........


 =========================================以上都是背景=================================================  
       其實仔細想了一下後,發現了其樹狀數組的本質.............
       之前我想用網絡流離線回答的時候,其實離樹狀數組已經不遠了。


        我的想法是,分別將n個字符串按字典序排序,在把他們倒過來按字典序排序,構成兩個數組,不妨按照二分圖的叫法,稱他們爲X 部,Y 部,把字符串抽象稱點.........(看起來真的比較像二分圖,所以去想網絡流哩0.0)
        把X,Y部中表示同一字符串的進行連邊,然後詢問可以看成是X部上的一段區間和Y 部上的一段區間,當然,很容易想到網絡流找有幾條邊滿足詢問(腳趾頭都知道醜的像渣一樣.......),然後,這個問題其實是可以轉化爲樹狀數組的。
       觀察這個問題的性質,有兩個限制條件,類比二維偏序的快排加樹狀數組,這個問題也可以用類似的東西來做。
        把X部上的區間的端點離散出來,從大到小枚舉之,然後不斷插入邊,利用樹狀數組以及容斥原理計算。
             比如:
                                                                      A                         B
                            “X 部”    ============i============i=========================
                                                    /        \                       /   \                     /
                                                   /           \                   /      \                  /
                                                  /             \                /         \               /
                             “Y部”    ===================i==============i================
                                                                                     C                             D
    
                                 [A,B]與[C,D] 對應的是一個詢問
                                我們從左往右掃X部,當遇到左端點A時,保證x部端點小於A 的 線段數量全部加入樹狀數組,統計此時C,D之間的線段數量爲  ans1,然後掃到右端點B時, 同樣保證x部端點小於B的 線段數量全部加入樹狀數組,統計此時C,D之間的線段數量爲ans2,根據容斥原理,得到這個詢問的答案 爲ans2-ans1;


             總之,這種有兩個限制條件的問題,一般來說就是快排維護一個條件,然後另外用數據結構維護另一個條件。  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章