復盤|第313場周賽
6192. 公因子的數(shù)目?https://leetcode.cn/problems/number-of-common-factors/
【暴力枚舉】遍歷1到min(a,b),同時能被a和b整除的數(shù)就是公因子咯。
【枚舉】相比上個稍微改進了下,遍歷1到gcd(a,b),如果i * i < g,說明i和g/i是兩個不同的因子,所以多加一次。
6193. 沙漏的最大總和?https://leetcode.cn/problems/maximum-sum-of-an-hourglass/
【枚舉】用中間的格子當錨點,枚舉中間的格子,然后累加自身和周圍六個格子。
6194. 最小 XOR?https://leetcode.cn/problems/minimize-xor/
【位運算 + 貪心】為了讓x xor num1的結(jié)果變小,必然是用x二進制位的1異或上num1二進制位的1,那么可以把x初始化為num1,1的誤差后面再處理。貪心思路:對于num1是從左往右盡可能刪1,如果多出來從右往左補1;對于x,如果1不夠,那么只保留左邊的1,相當于從右往左刪差額數(shù)量的1,如果1多出來了,在0的基礎(chǔ)上,加上差額的1。
復習下lowbit: x & (x - 1)最右1變0,x | (x + 1) 最右0變1。
6195. 對字母串可執(zhí)行的最大刪除數(shù)?https://leetcode.cn/problems/maximum-deletions-on-a-string/
【線性dp】看題意找到子問題,定義f[i]為s[i:]的最大刪除次數(shù),那么f[i] = f[i + j] + 1(j是前綴長度)。此外,本題需要用到LCP(最長公共前綴)即只有s[i: i + 1] == s[i + j: i + 2* j]時,才有f[i] = f[i + j] + 1,其他時候f[i] = 1(找不到公共前綴,只能全刪)。注意,遍歷時j的范圍計算:i + 2 * j <= n → j <= (n - i) // 2。
兩個后綴的最長公共前綴→lcp[i] [j] 是 s[i:]和s[j:]的最長公共前綴,lop[i] [j] ?= lop[i + 1] [j + 1] if s[i] == s[j] else 0(倆字串要是第一個字符都不一樣,最長公共前綴不存在,直接等于0)。只有每一項都相等才更新f[i],即lcp[i] [i + j] >= j。
代碼順序上,先倒推一次預處理lcp,再倒推一次算動態(tài)轉(zhuǎn)移。(因為本題的f[i]是由f[i+1]轉(zhuǎn)移而來,最后ans = f[0])
由于數(shù)據(jù)不強,本題也可以【記憶化+切片】,沒有超時。