Kefa and Watch 字串雜湊線段樹

2021-10-14 23:26:50 字數 2598 閱讀 9426

給定乙個長度為n, 且由數字組成的字串, 有兩種操作:

①把[l, r]區間的數字都變成c

②詢問[l, r]區間的數字是否可以 以d為長度作為迴圈節. (如12345123, 可以以長度為5的12345作為迴圈節, 只不過最後的123不是完整的迴圈節)

拿到這個題, 很快啊, 我們就發現是乙個區間修改區間詢問的問題, 最先想到的就是我們的老朋友線段樹.

分析:對於操作①而言, 只需要維護乙個懶標記即可.

對於操作②而言, 我們如何判斷乙個序列是否可以以長度d作為迴圈節呢? (由於最後出現的迴圈節不一定完整, 所以我們不能直接進行判斷)

不妨我們這樣來想: 假設當前的序列是有長度為d的迴圈節的, 那麼我們假想乙個新的序列c, 以[l, l + d]區間的數字為迴圈節. 我們把當前序列與序列c進行左對齊, 我們發現兩個序列共有的部分是完全相同的. 我們如果直接這樣建立乙個序列, 再去比較, 雖然可以達成要求, 但是單次比較的複雜度會是o(n).

但是我們可以通過上述思路,把當前序列進行適當的修改, 對齊來達成我們的目的. 前提: 下文中我們稱有長度為d的迴圈節的序列為合法序列.

假設有合法序列x, 如果我把這個序列x的前d個數字直接刪除, 那麼相較於序列x少了乙個迴圈節, 那麼現在新序列(稱為序列a)的開頭應該是迴圈節的開頭. 我們再把序列x的後面d個數字直接刪除, 得到新序列b. 此時序列b也相較於序列x少了乙個迴圈節. 我們此時比較序列a 是否等於 序列b即可.

那麼為什麼上述方法就可以了呢? 其實你會發現, 在序列a與b比較的過程中, 等價於序列a在與序列c進行比較. 序列x往後搓了乙個迴圈節, 再與自身進行比較. 如果是合法序列, 那麼最後一定是完全匹配的.

我們通過上面這些步驟的轉換, 我們發現操作②可以通過區間查詢的方式進行判斷.

對於查詢區間[l, r], 是否存在長度為d的迴圈節, 我們只需要判斷 串中[l + d, r]部分與[l, r - d]部分是否完全相同即可. 但是這樣下來比較兩個字串的複雜度還是o(n), 但是我們可以採用字串雜湊的方式進行優化. 把字串比較的複雜度降到常數.

結論:考察線段樹維護字串雜湊. 需要實現區間修改, 區間查詢操作.

時間複雜度o(mlogn) 空間複雜度: o(n)

#include

#define rep(i, n) for (int i = 1; i <= (n); ++i)

using

namespace std;

typedef

long

long ll;

const

int n =

1e5+

10, mod =

1e9+

7, b =

13331

;char w[n]

;int p[n]

;struct node t[n <<2]

;void

pushdown

(node& op,

int lazy)

void

pushdown

(int x)

void

pushup

(int x)

void

build

(int l,

int r,

int x =1)

;if(l == r)

return

;int mid = l + r >>1;

build

(l, mid, x <<1)

,build

(mid +

1, r, x <<1|

1); t[x]

.base =

(t[x <<1]

.base + t[x <<1|

1].base)

% mod;

pushup

(x);

}void

modify

(int l,

int r,

int c,

int x =1)

pushdown

(x);

int mid = t[x]

.l + t[x]

.r >>1;

if(l <= mid)

modify

(l, r, c, x <<1)

;if(r > mid)

modify

(l, r, c, x <<1|

1);pushup

(x);

}int

ask(

int l,

int r,

int x =1)

intmain()

}return0;

}

這個題看網上說也是卡自然取模的, 我之前看乙個字串雜湊的題也是qaq, 所以一般字串雜湊, 還是人工取mod吧.

ORACLE in 字串,字串,字串

因為傳進來的引數是 字串,字串,字串,要實現in 字串,字串,字串 select from htl price p where p.hotel id 30073328 and p.able sale date between to date 2009 03 27 yyyy mm dd and to ...

字串,字串陣列,字串指標!!

字串 字元陣列實際上是一系列字元的集合,也就是 字串 string 字串陣列 在c語言中,沒有專門的字串變數,沒有string型別,通常就用乙個字元陣列來存放乙個字串。c語言規定,可以將字串直接賦值給字元陣列 在c語言中,字串總是以 0 作為串的結束符。上面的兩個字串,編譯器已經在末尾自動新增了 0...

字串物件python int 字串 字串物件

最近研究字串物件,稍微總結一下,以後繼續補充 如果我們須要把python的字串物件轉換為數整物件,我們須要用到int方法。比如 ainfo 222 print int ainfo 輸出的結果是222。然後我們檢視下ainfo在現的型別,通過type方法檢視下,發現是 而如果ainfo fefew22...