[R75B] 串移位
数据规模:,, 仅由大写英文字母组成。
思路
循环左移 位后,新串 的第 个字符来自原串的 位,即 。于是要统计的就是满足
的下标 的个数。
先把 对 取模,记 ,因为移位数每达到 就回到原串。取模后 ,所有下标运算都落在合法范围内,且 取出 的巨大值也不会溢出。
随后从 到 逐个枚举 ,比较这两个字符是否相同并计数即可。特别地,当 时 与 完全相同,每个位置都贡献一次答案,这一点无需特判,循环本身就会得到 。
复杂度
时间 ,空间 (存放读入的字节串)。
仓颉实现
查看仓颉实现
import std.env.*
import std.convert.*
main() {
let reader = getStdIn()
let first = reader.readln().getOrThrow().split(" ", removeEmpty: true)
let n = Int64.parse(first[0])
let k = Int64.parse(first[1])
let s = reader.readln().getOrThrow().toArray()
let d = k % n
var ans: Int64 = 0
var i: Int64 = 0
while (i < n) {
if (s[i] == s[(i + d) % n]) {
ans += 1
}
i += 1
}
println(ans)
}