bzoj 3207 花神的嘲諷計畫

2021-07-05 13:06:51 字數 1369 閱讀 8911

題意:

給出乙個長度為n的序列,有m個詢問;

每次給出乙個區間[l,r]和乙個長度為k的短序列;

查詢區間中是否存在這個子串;

1<=n<=100000,1<=m<=100000,1<=k<=20;

題中所有資料不超過2*10^9;保證方案序列的每個數字<=n

題解:

這題我讀了好幾遍沒讀懂,看了題解才知道這問的是查詢乙個固定長度的字串是否在區間出現

然後就是簡單題了,用hash來搞;

處理原串中所有的hash值,然後如果[l,r]存在乙個hash值為a的子串,那麼預處理的那一段中一定也有乙個與其相同的元素;

利用離散化之後的可持久化線段樹實現;

查詢就是直接去查對應區間那個值是否存在;

時間複雜度o(nlogn),空間複雜度o(nlogn);

1a一道資料結構好愉悅啊!

**:

#include#include#include#define n 110000

#define m 5000000

#define seed 1000000007ll

using namespace std;

typedef unsigned long long ll;

int sum[m],ls[m],rs[m],tot;

int a[n],root[n],size;

ll hash[n],dis[n];

void pushup(int no)

void insert(int l,int r,int &no,int val)

}int query(int l,int r,int nol,int nor,int val)

else }

int main()

for(i=1,powk=1;i<=len;i++)

powk*=seed;

for(i=len;i<=n;i++)

sort(dis+1,dis+n-len+1);

size=unique(dis+1,dis+n-len+1)-dis-1;

for(i=len;i<=n;i++)

for(i=1;i<=m;i++)

k=lower_bound(dis+1,dis+size+1,now)-dis;

if(dis[k]!=now||query(1,size,root[l+len-2],root[r],k)==0)

puts("yes");

else

puts("no");

} return 0;

}

BZOJ 3207 花神的嘲諷計畫

背景 花神是神,一大癖好就是嘲諷大j,舉例如下 哎你傻不傻的!hqz 大笨j 這道題又被j屎過了!j這程式怎麼跑這麼快!j要逆襲了!描述 這一天dj在給吾等眾蒟蒻講題,花神在一邊做題無聊,就跑到了一邊跟吾等眾蒟蒻一起聽。以下是部分摘錄 1.j你在講什麼!我在講 哎你傻不傻的!這麼麻煩,直接 再 就好...

bzoj3207花神的嘲諷計畫

題意 給定乙個原字串和m個詢問,每次查詢原字串 l,r 內是否包含給定字串s len s 20且len s 相同 sol 考慮hash,將原串沒len s 位hash一次放入桶中,再將每次詢問hash後在桶中查詢 感覺很像rk hash 因為每次 l,r 轉移到 l,r 1 l 1,r 都是從桶中取...

BZOJ 3207 花神的嘲諷計畫

傳送門 因為 k 是固定的,所以我們可以預處理每一段 k 個的序列的雜湊值,那麼對於詢問我們只要判斷區間內是否有此雜湊值即可 顯然主席樹維護,沒了 include include include include include using namespace std typedef unsigned...