題目鏈結
題目描述
有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 想通過一種編碼方式使得它變得短一些。一部 ...