題意:
給定乙個原字串和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...