# Super-efficient version# for playing with million-digit palindromesdefstr_lt(x,y):"""Take two integer strings, `x` and `y`,return int(`x`) < int(`y`)"""returnlen(x) n and p is palindromicReturn str(p)Note: `n` must be well-formed, ie no leading 0s or non-digit characters"""# Make sure n is a stringifnotisinstance(n,str):n=str(n)# There are three forms of palindrome:# single digit, x (ab == '')# even number of digits, abba ( x == '')# odd number of digits, abxba ( x is single digit)#iflen(n)==1:# take care of single digit casereturn'11'ifn=='9'elsestr_add_1(n)else:# There are six possibilites for p:## (1) abqr < abba -> p = abba# (2) abqr >= abba -> p = a(b+1)(b+1)a (with carries as needed)# (3) abqr == 9999 -> p = 10001 (carry results in overflow)## (4) abxqr < abxba -> p = abxba# (5) abxqr >= abxba -> p = ab(x + 1)ba (with carries as needed)# (6) abxqr == 99999 -> p = 100001 (carry results in overflow)## Find ab, x, qrhalf=len(n)//2ab=n[:half]x=n[half:-half]# a 0- or 1-digit stringqr=n[-half:]ba=ab[::-1]ifstr_lt(qr,ba):# solve cases (1) and (4)return"".join([ab,x,ba])ifx=='9':# do manual carry from xab1=str_add_1(ab)ba1=ab1[::-1]iflen(ab1)>len(ab):# carry results in overflow - case (6)returnab1+ba1else:# carry but no overflow - case (5)return"".join([ab1,'0',ba1])ifx:# no carry - case (5)return"".join([ab,str_add_1(x),ba])# x == ''ab1=str_add_1(ab)ba1=ab1[::-1]iflen(ab1)>len(ab):# carry results in overflow - case (3)returnab1[:-1]+ba1else:# no overflow - case (2)returnab1+ba1