BZOJ3198 spring 雜湊 容斥原理

2021-09-02 07:46:57 字數 1386 閱讀 4313

題目鏈結

題目描述

有n組a,b,c,d,e,f,g,求a,b,c,d,e,f,g六個數中恰好有k個對應相等的對數,n

≤100000,0

≤k≤6

,0≤a

,b,c

,d,e

,f,g

≤2

30n\le100000,0\le k\le 6,0\le a,b,c,d,e,f,g\le 2^

n≤1000

00,0

≤k≤6

,0≤a

,b,c

,d,e

,f,g

≤230

容斥是廣義容斥,由至少求恰好,不會可以看看這個廣義容斥原理

想借這個題說說雜湊

先列舉二進位制狀態看哪幾位對應相同,再求那幾位相同的對數

想要快速得到相同的對數就需要把對應的幾個數壓縮成乙個數存在hash陣列裡面,但是可能會有不同的幾個數壓縮後成了同乙個數(衝突)

所以需要另存乙個id陣列,id[hashx]就記錄該雜湊值對應的原數,然後就把當前下標的那幾個數與下標為id[hashx]的對應數比較(解決衝突),如果相等就數量++,否則就在該hashx的鍊錶中新加入乙個點(想象連邊)

ps:也可以不用鍊錶,直接將hashx++,但是效率會低一些,一般都能過

也就是說,現在的hash陣列中的每一位都是乙個鍊錶的頭指標(fir),所以我們需要乙個next陣列,在邊上再存上原數下標(id,用於比較)

判斷相等的時候是o(6)的,也可以再用乙個hash, 兩次雜湊都相同的概率是很小的(但是無法保證正確性).

#include

#define maxn 100005

#define base 137

#define mod 1234567

int n,k,c[7]

[7],a[maxn][7

];struct _hash

inline

void

insert

(int pos,

int u,

int sta)if(

!i) nxt[

++tot]

=fir[u]

,fir[u]

=tot,id[tot]

=pos,q[tot]

=u,cnt[tot]=1

;}inline

long

long

calc()

}h;long

long

solve

(int sta)

return h.

calc()

;}intmain()

printf

("%lld"

,ans)

;}

洛谷3498 BZOJ2081 Beads 雜湊

題目鏈結 題意 給你乙個字串,對於i 1,n i in 1,n i 1,n 判斷每i個連續字元一組,組成若干個子串,最多能得到多少個不同的子串?最後餘下的不夠i ii的部分忽略。並且我們認為正序和倒序是相同的,例如認為 1,2 和 2,1 相同的。輸出最多得到不同子串的個數 有多少個k能得到這麼多 ...

BZOJ3574 HNOI2014抄卡組(雜湊)

容易發現萬用字元中間的部分可以任意匹配,會造成的無法匹配的僅僅是前字尾,字首和字尾可以分別獨立處理。如果字串均有萬用字元,只需要按前 字尾長度排序然後暴力匹配就可以了。問題在於存在無萬用字元的字串。顯然首先這些字串需要相同。剩下的字串只要都能與該字串匹配即可。然後就不會了。想了半天去看題解 暴力雜湊...

bzoj4198 哈夫曼樹 荷馬史詩

description 追逐影子的人,自己就是影子。荷馬 allison 最近迷上了文學。她喜歡在乙個慵懶的午後,細細地品上一杯卡布奇諾,靜靜地閱讀她愛不釋手的 荷馬史詩 但是由 奧德賽 和 伊利亞特 組成的鴻篇巨制 荷馬史詩 實在是太長了,allison 想通過一種編碼方式使得它變得短一些。一部 ...