[R28B]晚宴


数据规模:n≤1000n \le 1000,1≤Ai,Bi≤1091 \le A_i, B_i \le 10^9。

思路

餐桌顺时针旋转 kk 个单位时,原来在位置 jj 的菜移动到位置 (j+k) mod n(j+k) \bmod n。等价地说,旋转后位置 ii 上的菜来自初始位置 (i−k) mod n(i-k) \bmod n。美食家 ii 被满足的条件就是 B(i−k) mod n=AiB_{(i-k) \bmod n} = A_i。

旋转量 kk 只有 nn 种取值(0≤k≤n−10 \le k \le n-1),数据规模 n≤1000n \le 1000,所以直接枚举每一种旋转量 kk,再 O(n)O(n) 统计该旋转下被满足的美食家数量,取所有 kk 中的最大值即为答案。

复杂度

时间 O(n2)O(n^2),空间 O(n)O(n)。

仓颉实现

查看仓颉实现
import std.env.*
import std.convert.*

main() {
    let reader = getStdIn()
    let n = Int64.parse(reader.readln().getOrThrow())
    let a = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p: String => Int64.parse(p) })
    let b = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p: String => Int64.parse(p) })

    let nn = n
    var ans: Int64 = 0
    for (k in 0..nn) {
        var cnt: Int64 = 0
        for (i in 0..nn) {
            var j = (i - k) % nn
            if (j < 0) {
                j = j + nn
            }
            if (b[j] == a[i]) {
                cnt = cnt + 1
            }
        }
        if (cnt > ans) {
            ans = cnt
        }
    }
    println(ans)
}