D - Strange Mirroring(python解)——Atcoder
原题链接:
点击传送
问题分析:
- 将字符串 S 中的大写字母转换为小写字母,小写字母转换为大写字母,得到新字符串 T。
- 将 S 和 T 连接,形成新的 S。
这个过程会重复进行 10**100
次。由于查询 Ki 的值可能非常大(最大可达 10**18),直接模拟这个过程是不现实的。
思路:
-
观察字符串长度变化:
- 初始字符串 S 的长度为 n。
- 每次操作后,字符串长度翻倍:n→2n。
- 经过 m 次操作后,字符串长度为 n×2m。
-
查询处理:
-
对于每个查询 Ki,找到最小的 m 使得 n×2m≥Ki。
-
使用
divmod(int(K_i) - 1, n)
计算:
- d:操作次数。
- r:在当前字符串 S 中的索引。
-
-
字符转换:
-
通过
ord(s[r])
获取字符的 ASCII 值。 -
使用
d.bit_count() % 2
判断是否需要大小写转换:
- 如果 d 的 1 的个数为奇数,进行大小写转换。
-
使用
chr(...)
将计算后的 ASCII 值转换回字符
-
代码:
import sys
s, q, t = sys.stdin
n = len(s) - 1 # 计算字符串 s 的长度,减去换行符
for k in t.split(): d, r = divmod(int(k) - 1, n) # 计算操作次数和索引 print(chr(ord(s[r]) ^ (d.bit_count() % 2 << 5)), end=' ')
复杂度分析
- 时间复杂度:每个查询处理时间为O(1),总时间复杂度为 O(Q)。
- 空间复杂度:使用常数级别的额外空间,空间复杂度为 O(1)。
祝AC...........................