BZOJ3207 花神的嘲諷計畫

2022-08-22 16:36:13 字數 1273 閱讀 6127

先把長度為k的字串雜湊掉,然後用可持久化線段樹判斷是否存在。。。

可持久化線段樹直接上模板,然而雜湊。。。

這裡有三種雜湊方法:①排個序,去個重,查詢的時候二分

②hash[i]=hash[i-1]*大質數+val[i]

③鬼畜查字元版雜湊

下面的**是第一種,然而加了讀入優化更慢是什麼鬼qaq

1 #include2 #include3 #include4

using

namespace

std;56

#define maxn 100005

7int tot,tree[maxn*20],lson[maxn*20],rson[maxn*20

],root[maxn];

8int

nn,n,m,k,val[maxn],yooo[maxn],hash[maxn],pos[maxn];

9int

read()

17return

tmp;18}

19bool cmp(int x,int

y)24

return

false;25

}26int cmp2(int

x)31

return0;

32}33bool buyiyang(int x,int

y)38

void build(int x,int &y,int l,int r,int

val)

46else50}

51bool query(int x,int y,int l,int r,int

val)

58int

main()

65 sort(pos+1,pos+1+n,cmp);

66 hash[pos[1]]=++nn;

67for(int i=2;i<=n;i++)

71for(int i=1;i<=n-k+1;i++)

72 build(root[i-1],root[i],1

,nn,hash[i]);

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

84if(!cmp2(pos[l])&&query(root[ql-1],root[qr-k+1],1,nn,hash[pos[l]]))printf("

no\n");

85else printf("

yes\n");

86}87return0;

88 }

view code

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你在講什麼!我在講 哎你傻不傻的!這麼麻煩,直接 再 就好...

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 都是從桶中取...