D - Strange Mirroring(python解)——Atcoder

D - Strange Mirroring(python解)——Atcoder

原题链接:

点击传送

问题分析:

  1. 将字符串 S 中的大写字母转换为小写字母,小写字母转换为大写字母,得到新字符串 T
  2. ST 连接,形成新的 S

这个过程会重复进行 10**100 次。由于查询 Ki 的值可能非常大(最大可达 10**18),直接模拟这个过程是不现实的。

思路:

  1. 观察字符串长度变化

    • 初始字符串 S 的长度为 n
    • 每次操作后,字符串长度翻倍:n→2n。
    • 经过 m 次操作后,字符串长度为 n×2m。
  2. 查询处理

    • 对于每个查询 Ki,找到最小的 m 使得 n×2mKi

    • 使用

      divmod(int(K_i) - 1, n)
      

      计算:

      • d:操作次数。
      • r:在当前字符串 S 中的索引。
  3. 字符转换

    • 通过 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...........................

posted @ 2024-11-17 09:56  MPyGF  阅读(39)  评论(0编辑  收藏  举报