原创 WHU 1572 Cyy and Fzz(AC自動機+dp)

題意:給出n個模板串,隨機一個串,求出現模板串個數的期望(相同算一個)。 做法:比賽時誤以爲是求模板串出現了幾次,用dp[i][j]代表在第i個節點還要走l步的期望,然後記憶化搜索。。不停的wa。。 後來問了別人才知道是看錯題目了。做法應

原创 URAL 2041 Nanomatryoshkas(貪心)

題意:給出n個俄羅斯套娃,分別有內體積和外體積,要一個套住另外一個必須內體積要大於另一個的外體積,問你能不能找出一個排列使得每一個都不能套住前面一個。對於一個套娃,保證外體積大於等於內體積 做法:我們先按照外體積降序排序,相同按照內體積降

原创 poj 3415 Common Substrings(後綴數組+單調棧)

題意:給2個串,求2個串的後綴之間公共串長度>=k的對數。 做法:單調棧維護3個東西,一個是height,一個是在之上到前一個元素(其實包括這個前一個元素)之間另一個串後綴的個數,還有個位置。用dp[i]代表rank爲第i個串與之上所有另

原创 poj 1470 Closest Common Ancestors (離線LCA Tarjan)

題意:求每個點作爲lca的次數。 做法:裸的lca題,離線做法就是利用並查集,關鍵思想在於對於當前點的詢問對應的另一個點已經被訪問過了,那麼那個點的祖先就是這個詢問的lca。 AC代碼: //#pragma comment(linker,

原创 NOIP 2013 貨車運輸(樹上倍增)

題意:n個點,m條邊,要求從x到y點路上最小的邊權最大的值。 做法:求一次最大生成樹,因爲對於2個聯通塊,最大生成樹的邊一定是最大的,故其他邊都可以刪去。之後就是一棵樹了。可以用樹鏈剖分,不過這裏由於只有查詢沒有修改,故學習了下代碼量比較

原创 hdu 5213 Lucky(容斥+莫隊)

題意:給2個區間,從2個區間內各取一個數字,求a_i+a_j = k的對數。 做法:假設區間範圍是[x1,y1]和[x2,y2],我們設f(a,b)爲區間a,b中等於k的對數總數,那麼答案就是f(x1,y2)-f(x1,x2-1)-f(y

原创 WHU 1583 Palindrome(迴文樹)

題意:把一個串分成2部分,求左半部份的本質不同迴文串個數等於右半部份本質不同迴文串個數的2倍的所有位置乘起來的答案。 做法:學習了下回文樹,總結幾點。 1.用編號去代表每個不同的迴文串。比如編號爲5的迴文串爲aba,那麼next[5]['

原创 BZOJ 2565 最長雙迴文串(manacher)

題意:求一個最長的雙迴文串,雙迴文串定義是兩個迴文串是連續的但是不相交。 做法:manacher預處理一下。然後用h1[i]代表以i爲結尾的最長迴文串,h2[i]代表以i爲起點的最長迴文串。我這裏用了一個單調隊列,因爲對於一個點來說,作爲

原创 hdu 5217 Brackets(線段樹)

題意:給一串括號,有2個操作,1。翻轉某個括號。2。查詢某段區間內未匹配的括號(或者說跟他匹配的在區間外面),第k個未匹配的括號是第幾個。 做法:我們可以把一段區間的括號匹配情況總結爲)(,即左邊的右括號和右邊的左括號,其餘的自然都已經匹

原创 hdu 3507 Print Article(斜率優化dp)

題意:把一堆數分成幾堆,每堆的代價由這個式子:,算出。求總代價最小。 做法:另dp[i]是分到第i個總代價最小,那麼轉移方程,dp[i] = dp[j]+(sum[i]-sum[j])^2+M。可以發現遞推複雜度是o(n^2)。 我們變形

原创 WHU 1568 Product(數位dp)

題意:給出一個數字,要求每位乘起來等於原數字的數字個數,每位的數字只能是2-9。 做法:可以發現2-9數字中素數只有2 3 5 7,而5和7是不能進行拆分和合並的,所以我們只需要考慮2和3,用dp[i][j][k]代表2的個數爲i個,3的

原创 hdu 5208 Where is Bob(數位dp)

題意:Alice和Bob各有一個選擇數的區間,2人各選一個異或是最後的值,Alice想讓這個數大,Bob想讓這個數小,2人都很聰明,Alice先選,問最後的數是多少? 做法:可以知道如果要異或爲1,那麼必須一個爲0,一個爲1,因爲Alic

原创 CodeForces - 548D Mike and Feet(單調棧)

題意:給出n個數,假設區間長度爲k,給定一個起點求區間最小值,由於有很多起點,所以要求的是這些的最大值。然後k的範圍是1-n。。(感覺好彆扭)。所以要輸出n個答案。 做法:我們都知道單調棧可以處理出一個數爲最小值的最長區間,那麼先處理出這

原创 HDU 2471 History of Languages(自動機BFS)

題意:給你2個DFA,問你是否等價,狀態有n(1<=n<=2000)個,每個狀態第一個0或1代表非終態或終態,其後t(1<=t<=26)個數a[i]代表下個字母爲第t個就轉移到a[i]這個狀態。 做法:由於那些不能到達終態的狀態無論怎麼樣

原创 CodeForces - 49E Common ancestor(dp)

題意:有n個替換規則,2個字母可以被替換成一個字母,給出2個串,問這2個串經過一系列的替換後形成的最短且相同的串長度是多少。 做法:我們可以先用區間dp,d[i][j][k]代表i到j區間是否可以變成k這個字母。再利用vector去存一下