給定乙個長度為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...