Hdu6586 String 字串字典序貪心

2022-08-10 04:03:10 字數 875 閱讀 1184

給出乙個只包含26個字元的字串(|s|<=1e5),要求從中取出長度為k的字典序最小的組序列,滿足所給的26個字母的限制條件,例如\([l_i,r_i]\),表示i字元的數量關係限制

1.對於構造字典序最小的序列,通常是一位一位構造的。

2.首先題目有限制條件,所以我們考慮一下什麼條件時才滿足限制條件。

我們從a開始取,每次碰到a,如果滿足限制條件,我們肯定取上,這樣才能滿足字典序最小,那麼限制條件是什麼?什麼時候停止取a轉向去取b,我們對此進行思考:假設在確定當前位置pos時,pos時的字元取不取,取決於其滿不滿足限制條件,那什麼條件滿足的時候才能取呢,乙個淺顯的思路,肯定要夠取到每個字母的下界才能取,不然總數都不夠,取個錘子。那麼就還剩下了k這個限制條件,因為要取k個,這個如何轉化呢?假設已經取了c個取當前的pos的點,因為我們是從字典序小的字母向字典序大的字母取的,那麼下一次是取和這個pos點相同的字母,還是取下乙個字母呢?因為還要取cnt=k-c-1個cnt肯定要大於後面的未滿足的限制條件的下界和,同時cnt還不能超過未滿足的上界的和,不然就炸了。因為這個判斷條件只能判斷當前這個點能不能取(例如(abba)假如第二個a不能取,那也要到第二個a才能判斷,如果直接掃過去,發現第二個a不能取,又要倒回第乙個a後面取b,這樣就變成了o\((n^2)\)所以我們要對此優化,只要開個陣列記下每個字母的位置,然後每次從這個陣列中找下乙個字母的位置進行判斷即可)由此我們把問題轉化成了:從a-z取,若a滿足限制條件則繼續取a,否則去取b,以此類推,因為我們的思考,等於說已經把限制條件封裝成了乙個函式,只要每次取的時候呼叫這個函式即可。

對於找字典序的最小最大的題意,一般都是一位一位確定。以此為核心,同時還要把限制條件轉化,判斷該位能不能取(判斷條件可能是字首,字尾等),可能還要記錄位置優化,這樣就能盡可能取小(大)的字典序,並且複雜度大部分題為\(o(n)\)

HDU 4821 String(字串雜湊)

傳送門 題目大意就是給你乙個字串,然後問你在這個字串裡有多少個長度為m l m lm l 的子串,並且這連續的 m mm 個長度為 l ll 的子串還要相互不一樣。直接h as hhash hash 選取乙個起始位置 1 l 1 l 1 l 然後每 l ll 個 has hhash hash 一下,...

String字元補充

一 string字串補充 對於string 獲取 length chatat indexof 有三種 lastdexof 判斷 contains isempty startwith endwith equals equalsignore 替換 replace 轉換 trim touppercase ...

String 字元處理

查詢字串 indexof indexof start,end 接收兩個引數,返回某個指定的子字串在字串中地一次出現的位置,如果沒有就返回 1,它預設是從下標0開始查咋的。let str hello world let str1 str.indexof o let str2 str.indexof w...