首先,我想补充一下有关二进制枚举的另一个题:
当然,我们可以开个long long 来对学号进行加法运算,再把n-1个同学的学号减去,剩下的即为没来的同学,那n如果很大,时间肯定超。
那什么运算可以使数据大小限定在一定的范围并且有一定的还原功能?
异或运算。
我们先把这全异或起来,再异或n-1个学号,剩下的即为没来的同学。
再加点难度:如果没来的是2个呢?
我们按上面的方法最终求得的是两个没来同学学号的异或值。
显然,其中一定有1(不然两个学号就一样了)
因此,在那一位上,没来的同学一个是1,一个是0.我们按这个把全部的学号分成两组,每一组一定有一个没来的同学,再分别对其上面的操作即可。
接下来我们看一道比较难的题:
下面我用图进行分析:
下面为 AC代码:
最后,来个有趣的题来结束吧:
下面进行分析:
首先,对于每一个B,其每一个字符可能在A中出现了好几次,我们只用找到第一次。
因此,我们只要确定每一个A字符后面1--26个字符第一次出现的位置,然后像链表去找就行。
那如何维护这个每一个A字符后面1--26个字符第一次出现的位置的信息呢?
我们可以创建一个数组,让其从后往前遍历,对于每个字符出现的最新位置更新并把信息赋给当前的字符即可。
下面是AC代码: