AT_abc398_f [ABC398F] ABCBA 题解
考虑对 \(s\) 正反各做一遍哈希,记为 \(hl_i, hr_i\),这里我取了 \(B = 1331\),反正一般取什么值都没什么问题的,因为可以自然溢出,哈希的 query 函数也很好写,一般形式如下:
int query(int l, int r) {
return hash[r] - hash[l - 1] * powb[r - l + 1];
}
为了方便,接下来记 \(ql(l, r)\) 表示 \(s_l \sim s_r\) 的哈希值,\(qr(l, r)\) 表示 \(s\) 翻转字符串之后 \(s_l \sim s_r\) 的哈希值。
然后我们从小到大枚举 \(i\),如果 \(ql(i, n) = qr(1, n - i + 1)\) 说明位置 \(i\) 就是答案,又因为我们是从小到大枚举的,所以答案就直接是最优的。

浙公网安备 33010602011771号