bzoj3207: 花神的嘲諷計劃Ⅰ(hash+主席樹)
題目傳送門
。
解法:
然而我不是很清楚hash為啥要開long long
int 不行嗎。。
hash學習
學了一發hash。
這個東西有點狗啊。
有機率重複啊。。
不過很小(歐洲人)
然後主席樹維護一下每個hash。
離散化一下。
因為長度為k。
那麼把進來的串變成hash。
然後在區間找這個hash是否出現過。。
然後就本機AC提交WA了。
改了longlong才過。
難道int就使得hash重複了嗎。
程式碼實現:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
typedef unsigned long long ll;
struct node {int lc,rc,c;}t[5100000];int cnt,rt[1100000];
void build(int &u,int l,int r,int p) {
if(u==0)u=++cnt;t[u].c++;
if(l==r)return ;int mid=(l+r)/2ll;
if(p<=mid)build(t[u].lc,l,mid,p);
else build(t[u].rc,mid+1,r,p);
}
void Merge(int &u1,int u2) {
if(u1==0) {u1=u2;return ;}if(u2==0)return ;
t[u1].c+=t[u2].c;
Merge(t[u1].lc,t[u2].lc);
Merge(t[u1].rc,t[u2].rc);
}
ll base=222;
ll a[110000];int n,m,K;
struct edge {ll x;int id;}Hash[1100000];
bool cmp(edge n1,edge n2) {return n1.x<n2.x;}
int pos(ll x) {
int l=1,r=n-K+1,mid,ans=0;
while(l<=r) {
mid=(l+r)/2;
if(Hash[mid].x<=x) {
if(Hash[mid].x==x)ans=mid;
l=mid+1;
}else r=mid-1;
}return ans;
}
bool find(int u1,int u2,int l,int r,int x) {
if(t[u1].c-t[u2].c==0)return false;
if(l==r)return true;int mid=(l+r)/2;
if(x<=mid)return find(t[u1].lc,t[u2].lc,l,mid,x);
else return find(t[u1].rc,t[u2].rc,mid+1,r,x);
}int s[1100000];
ll hash() {
ll ans=0;
for(int i=1;i<=K;i++)ans=ans*base+a[i];
return ans;
}
int main() {
//freopen("3027.in","r",stdin);freopen("3027.out","w",stdout);
scanf("%d%d%d",&n,&m,&K);cnt=0;
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
for(int i=1;i<=n-K+1;i++) {
Hash[i].x=0;Hash[i].id=i;
for(int j=i;j<=i+K-1;j++)Hash[i].x=Hash[i].x*base+a[j];
}sort(Hash+1,Hash+1+n-K+1,cmp);
int tot=0;
for(int i=1;i<=n-K+1;i++) {
if(Hash[i].x!=Hash[i-1].x)tot++;s[i]=tot;
build(rt[Hash[i].id],1,n-K+1,tot);
}
for(int i=1;i<=n-K+1;i++)Merge(rt[i],rt[i-1]);
while(m--) {
int l,r;scanf("%d%d",&l,&r);
for(int i=1;i<=K;i++)scanf("%lld",&a[i]);
int X=pos(hash());
if(X==0) {printf("Yes\n");continue;}
if(find(rt[r-K+1],rt[l-1],1,n-K+1,s[X])==true)printf("No\n");
else printf("Yes\n");
}
return 0;
}
相關文章
- 主席樹
- 主席樹模板
- 亞馬遜嘲諷甲骨文:沒有新公司會用Oracle亞馬遜Oracle
- 靜態主席樹模板
- 動態主席樹模板
- Bash-Insulter:一個在輸入錯誤命令時嘲諷使用者的指令碼指令碼
- ROTK微博隔空回懟PPD:菜成馬也敢嘲諷中國隊?
- 37歲老程式設計師8點下班被同事嘲諷:公司寄生蟲,網友:討厭奮鬥逼程式設計師
- HDU2665 Kth number【主席樹】
- HDU4417 Super Mario【主席樹】
- BZOJ4299: Codechef FRBSUM(主席樹)
- D-query SPOJ - DQUERY (主席樹)
- 百度女程式設計師加班到一點,半夜叫車被司機嘲諷:收入不如我,圖啥程式設計師
- bzoj3439: Kpm的MC密碼(主席樹+DFS序+字典樹)密碼
- 外國人嘲諷中國網際網路公司的996模式, 網友: 都是被員工給慣的996模式
- 【資料結構】淺談主席樹資料結構
- 洛谷P4197 Peaks(Kruskal重構樹 主席樹)
- 求區間不同數的個數【主席樹求解】
- “打得不錯”:為什麼《爐石》玩家可以默契地用禮貌詞語進行嘲諷?
- 程式設計師地鐵上寫程式碼被網友嘲諷太裝:訊號都不好,寫什麼程式碼!程式設計師
- bzoj3524: [Poi2014]Couriers(主席樹)
- HDU-4348 - To the moon (主席樹+區間修改)
- 【主席數】可持續化線段樹
- SDOI2018 原題識別(主席樹)
- 演算法隨筆——主席樹(可持久化線段樹)演算法持久化
- 【主席樹】P3919 【模板】可持久化線段樹 1持久化
- bzoj3545: [ONTAK2010]Peaks(主席樹+最小生成樹)
- bzoj4477: [Jsoi2015]字串樹(主席樹+Hash+Lca)JS字串
- #程式設計師遭嘲諷:拿著30、40k,就幹curd和幾個簡單玩意兒?網友:眼高手低程式設計師
- bzoj5177: [Jsoi2013]貪心的導遊(主席樹)JS
- bzoj2809: [Apio2012]dispatching(DFS序+主席樹)API
- bzoj5178: [Jsoi2011]棒棒糖(主席樹)JS
- bzoj1112: [POI2008]磚塊Klo(主席樹)
- bzoj2588: Spoj 10628. Count on a tree(主席樹+LCA)
- 劃分樹
- 2024年3月21日 懸繩法 + 珂朵莉樹(ODT) + 主席樹
- 可持久化線段————主席樹(洛谷p3834)持久化
- bzoj3110: [Zjoi2013]K大數查詢(主席樹+樹狀陣列)陣列