复盘|第333场周赛
合并两个二维数组 - 求和法
【哈希 + 排序】按题意模拟。
【归并排序(双指针)】
将整数减少到零需要的最少操作数
【暴力】每次将n减去离他最近的一个二次幂数,对abs(n - 这个数)进行重复操作,直到n为0。 离n最近的二次幂数为pow(2, round(log2(n)))。
【记忆化搜索】变成0就是二进制位都是0,暴力判断,二进制位最右边的1(低位1的修改影响到了高位),是加1还是减1(加1能进位,减1就很普通)。判断x是2的幂次——x & (x - 1) == 0。
【位运算 + 贪心】优先消除最低位的1,设它对应的数字为lowbit,消除方法是加上lowbit或减去lowbit。如果有多个连续 1,那么采用加法是更优的,可以一次消除多个 1;否则对于单个 1,减法更优。
【位运算 + 找规律】对于多个连续1,如果它和前面的1被至少两个0隔开,那么就需要先加上lowbit产生单个1,再减去lowbit去掉这个1,需要操作两次。注意到n ⊕ 3n刚好可得到两个1,对于单个1,n ⊕ 3n刚好可得到1个1,所以ans = n ⊕ 3二进制中1的个数。
无平方子集计数
【0-1背包】将无平方因子数的数字记作SFI,对于每个[2,30]内的SFI,预处理得到对应的质数集合,用二进制表示(从低祷告第i个比特为1表示第i个质数在集合中,如3,5表示为110,2是0,3/5是1)把每个SFI的nums[i]转换成对应的质数集合,题目就变成选一些不相交的质数集合,他们的并集恰好为集合j的方案数。
【子集状压DP】枚举mask的补集cs的子集j,有f[j|mask] += f[j]·cnt[x],其中x是mask对应的SFI,cnt[x]是x在nums中的出现次数。
找出对应 LCP 矩阵的字符串
【构造 + DP】构造方案:1.初始化长为n的字符串s,初始化所有s[i]为0,初始化待填入字母c为‘a';2.找到第一个\0的下标i,把所有j≥i且lcp[i] [j]>0的s[j]填入c;3.c加一,重复第2步,直到没有这样的i,或者用完了26个小写字母(此时不合法)。构造完后需要计算s的真实LCP,检查是否和输入的lcp数组完全一致,计算方式是dp,如果s[i]=s[j],那么lcp[j]=lcp[i]+[j+1]+1;如果s[i]!=s[j],那么lcp[i] [j]=0。