bzoj3207花神的嘲諷計畫

2022-04-30 05:27:08 字數 1120 閱讀 6175

題意:

給定乙個原字串和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]都是從桶中取出or放入乙個數,複雜的o(1),可以使用莫隊演算法

p.s.需要離散化而不能取模,否則memset複雜度**

#include#include

#include

#include

#include

#define int long long

using

namespace

std;

const

int mx=100010

;const

int p=23333333ll;

struct node str[mx];

bool cmp1 (node a,node b)

bool cmp2 (node a,node b)

int n,m,k,temp,a[mx],h[mx],ton[p+10

],ans[mx];

signed main()

for(int i=k,tmp=1;i>=1;i--) h[1]+=tmp*a[i],tmp*=37,tmp%=p,h[1]%=p;

for(int i=k+1;i<=n;i++) h[i-k+1]=(((h[i-k]-(a[i-k]*temp))*37+a[i])%p+p)%p;

sort(str+1,str+1+m,cmp1);

for(int i=1;i<=m;i+=sqrt(m)) sort(str+i,str+min(m,i+(int

)sqrt(m)),cmp2);

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

else

for(int j=str[i-1].y,to=str[i].y;j!=to;)

}ans[str[i].num]=ton[str[i].val];

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

return0;

}

bzoj 3207 花神的嘲諷計畫

題意 給出乙個長度為n的序列,有m個詢問 每次給出乙個區間 l,r 和乙個長度為k的短序列 查詢區間中是否存在這個子串 1 n 100000,1 m 100000,1 k 20 題中所有資料不超過2 10 9 保證方案序列的每個數字 n 題解 這題我讀了好幾遍沒讀懂,看了題解才知道這問的是查詢乙個固...

BZOJ 3207 花神的嘲諷計畫

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

BZOJ 3207 花神的嘲諷計畫

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