本文共 2912 字,大约阅读时间需要 9 分钟。
为了解决这个问题,我们需要找到生成的字符串中字典序最小和最大的字符串的Rank,以及它们在生成字符串中的出现次数。以下是详细的解决方案。
import sysdef main(): str = sys.stdin.readline().strip() len = len(str) if len == 0: print("0 0 0 0") return # 初始化next数组 nexts = [0] * len j = -1 for i in range(len): if j == -1: nexts[i] = j else: j = nexts[j] while j != -1 and str[i] != str[j]: j = nexts[j] if str[i] == str[j]: j += 1 nexts[i] = j # 计算最小循环节长度 min_cycle = len for i in range(len): if nexts[i] == len - 1: min_cycle = min(min_cycle, len - (i + 1)) # 计算循环次数 cycle_len = len // min_cycle if min_cycle == 0: cycle_len = len # 处理出现次数 # 计算所有生成字符串的出现次数 # 由于循环节可能有多个重复,出现次数是 len / (len - nexts[len-1]) # 这里假设循环节长度为min_cycle # 出现次数为 len / min_cycle # 但如果min_cycle是0,则出现次数为1 if min_cycle == 0: appear_min = 1 appear_max = 1 else: appear_min = len // min_cycle appear_max = len // min_cycle # 找到最小的Rank def find_min_rank(): current = 0 j = 0 k = 0 min_rank = 0 while current < len and j < len: if k == 0: if j == current: min_rank += 1 j += 1 else: current += 1 else: if str[(current + k) % len] == str[(j + k) % len]: k += 1 else: current += 1 if current > j: j = current k = 0 return min_rank min_rank = find_min_rank() # 找到最大的Rank def find_max_rank(): current = 0 j = 1 k = 0 max_rank = 0 while current < len and j < len: if k == 0: if j == current: max_rank += 1 j += 1 else: current += 1 else: if str[(current + k) % len] > str[(j + k) % len]: k += 1 else: current += 1 if current > j: j = current k = 0 return max_rank max_rank = find_max_rank() # 输出结果 print(f"{min_rank} {appear_min} {max_rank} {appear_max}")if __name__ == "__main__": main() nexts数组中。nexts数组,找到字符串的最小循环节长度。该方法确保了在处理大字符串时的高效性,能够在线性时间内完成预处理和寻找任务。
转载地址:http://suqjz.baihongyu.com/