復盤|第303場周賽
第一個出現(xiàn)兩次的字母
【哈希集合】用?set
?保存已經(jīng)出現(xiàn)的字母。
相等行列對
【哈希表】用哈希表統(tǒng)計每行出現(xiàn)的次數(shù),然后遍歷列,累加哈希表中列出現(xiàn)的次數(shù)。
設(shè)計食物評分系統(tǒng)
【有序集合】我們可以用一個哈希表s記錄每個食物名稱對應(yīng)的食物評分和烹飪方式,另一個哈希表套平衡樹cs記錄每個烹飪方式對應(yīng)的食物評分和食物名字集合。對于changeRating操作,先從cs[fs[food].cuisine]中刪掉舊數(shù)據(jù),然后將new Rating和food記錄到cs和fs中。
【懶刪除堆】用堆:對于changeRating操作,直接往cs中記錄,不做任何刪除操作;對于highestRated操作,查看堆頂?shù)氖澄镌u分是否等于其實際值,若不相同則意味著對應(yīng)的元素已被替換成了其他值,堆頂存的是個垃圾數(shù)據(jù),直接彈出堆頂;否則堆頂就是答案。
優(yōu)質(zhì)數(shù)對的數(shù)目
【遍歷】對于x|y和x&y,在同一個比特位上,如果都有1,那這個1會被統(tǒng)計兩次;如果一個為1另一個為0,那這個1會被統(tǒng)計一次。記c(x)為x的二進制表示中的1的個數(shù),則有如下等式:c(x|y)+c(x&y)=c(x)+c(y)。另外一種思路是把二進制數(shù)看成集合,根據(jù)容斥原理AUB=A+B-A∩B,得AUB+A∩B=A+B.
【后綴和優(yōu)化】從小到大遍歷cnt[c(x)]],由于c(y)≥k-c(x),c(y)也會從大到小減小,我們可以用后綴和維護這些cnt[c(y)]的和。