題意:
給出乙個長度為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...