P2870 USACO07DEC最佳牛线黄金Best Cow Line Gold题意给一个字符串每次只能从两边取加入到答案要求取出来之后答案的字典序最小。���len=500000500000思路因为这道题要求答案字典序最小所以我们有一个贪心策略:每一次都取两端的较小者一直取完。这一定是没有问题的此时局部最优解就是全局最优解。关键是当两端相同时应该怎么办。当字符串为 ������ACERHA 时我
在哈希操作中,我们需要判断两端是否相同。假设左端为[lef, lef+len-1],右端为[rig-len+1, rig]。我们可以通过计算两端的哈希值来判断它们是否相同。
对于左端的哈希值,我们可以使用哈希数组ha1来计算。假设ha1[i]表示字符串前i个字符的哈希值,则左端的哈希值可以表示为ha1[lef+len-1] - ha1[lef-1]*base^len。
对于右端的哈希值,我们可以使用哈希数组ha2来计算。假设ha2[i]表示字符串后i个字符的哈希值,则右端的哈希值可以表示为ha2[rig-len+1] - ha2[rig+1]*base^len。
在计算哈希值时,我们需要避免出现负数,因此需要将结果加上一个模M(M为一个较大的素数)。
最后,我们将左右端的哈希值进行比较,如果相同,则返回true,否则返回false。
在代码中,乘以bas[len]是为了计算哈希值时的权重。由于base是一个较大的素数,所以乘以bas[len]可以保证每一位的权重都不同,从而避免哈希冲突的发生。
原文地址: https://www.cveoy.top/t/topic/izqZ 著作权归作者所有。请勿转载和采集!