蓝桥杯训练赛二-1467 问题 F: 蓝桥杯基础练习VIP-完美的代价
题目描述
回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
交换的定义是:交换两个相邻的字符
例如mamad
第一次交换 ad : mamda
第二次交换 md : madma
第三次交换 ma : madam (回文!完美!)
交换的定义是:交换两个相邻的字符
例如mamad
第一次交换 ad : mamda
第二次交换 md : madma
第三次交换 ma : madam (回文!完美!)
输入
第一行是一个整数N,表示接下来的字符串的长度(N < = 8000)
第二行是一个字符串,长度为N.只包含小写字母
第二行是一个字符串,长度为N.只包含小写字母
输出
如果可能,输出最少的交换次数。
否则输出Impossible
否则输出Impossible
样例输入
5 mamad
样例输出
3
1 MAX = 100000000 2 3 def rfind(s, l, r, v): 4 for i in range(r, l-1, -1): 5 if s[i] == v: 6 return i 7 return -1 8 9 def move(s, fr, to): 10 for i in range(fr, to): 11 s[i], s[i+1] = s[i+1], s[i] 12 13 def f(s): 14 n = len(s) 15 res = 0 16 r = n - 1 17 for i in range(n//2): 18 lst = rfind(s, i+1, r, s[i]) 19 if lst <= i: 20 if n % 2 == 0: 21 return MAX 22 else: 23 res += (r - i) // 2 24 else: 25 res += r - lst 26 move(s, lst, r) 27 r -= 1 28 pass 29 30 return res 31 32 33 34 n = int(input()) 35 s = list(input()) 36 r = f(s) 37 if r < MAX: 38 print(r) 39 else: 40 print('Impossible')
浙公网安备 33010602011771号