本文共 1969 字,大约阅读时间需要 6 分钟。
为了解决这个问题,我们需要计算最少需要使用第二个机器的次数才能生成目标项链。这个问题可以通过预处理回文区间并使用贪心算法来解决。
def manacher(s): n = len(s) a = ['!$'] + ['$'] * n + ['$'] a[1] = s[0] a[2] = '$' for i in range(2, 2 * n): a[i] = s[i - 2] a[i + 1] = '$' a[2 * n] = '*' p = [0] * (2 * n + 2) p[1] = 1 rmax = 0 id = 1 for i in range(2, 2 * n + 2): if i > rmax: p[i] = 1 else: k = i - p[i - 1] if a[k] == a[i + p[i - 1] - 1]: p[i] = p[i - 1] + 2 else: p[i] = 1 if i + p[i] - 1 > rmax: rmax = i + p[i] - 1 id = i d = [(0, 0)] * (2 * n + 2) for i in range(1, 2 * n + 1): d[i] = (i - p[i], i + p[i] - 1) events = [] for i in range(1, 2 * n + 1): if d[i][0] == 0 and d[i][1] == n - 1: events.append((d[i][1], 'event')) elif d[i][1] < n: events.append((d[i][1], 'interval')) events.sort() res = 0 last_end = -1 for event in events: if event[0] > last_end: res += 1 last_end = event[0] return resdef solve(s): n = len(s) if n == 0: return 0 events = [] for i in range(n): l = i - manacher(s)[i] r = i + manacher(s)[i] events.append((r, i, i)) events.sort() res = 0 last = -1 for r, l, i in events: if r > last: res += 1 last = r return res - 1def main(): import sys for line in sys.stdin: s = line.strip() print(solve(s))if __name__ == "__main__": main()
该方法通过预处理回文区间并使用贪心算法,确保了在最少的连接次数下生成目标项链。
转载地址:http://czwo.baihongyu.com/