'''
Created on 17-Jul-2011
@author: Naresh
'''
def nextPalindrome1(pal):
length = len(pal)
if (length & 1 == 0):
if length == 0:
return pal
half = length >> 1
if (needsIncrement(pal, half -1, half, length)):
return increment(pal, half -1, half, length)
else:
return pal[0:half-1] + pal[half-1]*2 +(pal[0:half-1])[::-1]
else:
if length == 1:
if (pal == "9"):
return (11)
else:
return int(pal) + 1
half = length >> 1
if (needsIncrement(pal, half, half, length)):
return increment(pal, half, half, length)
else:
return pal[0:half] + pal[half] +(pal[0:half])[::-1]
def increment(pal, i, j, length):
if (length & 1 == 0):
temp = pal[0:i] + pal[i]*2 +(pal[0:i])[::-1]
else:
temp = pal[0:i] + pal[i] +(pal[0:i])[::-1]
intPal = int(pal)
while (int(temp) <= intPal):
index = i
while(index >= 0):
if (temp[index] != "9"):
break;
index -= 1
if (index == -1):
temp = "1" + ("0" * (j)) + temp[j:length]
else:
temp = temp[0:index] + `int(temp[index]) + 1` + (i - index)*"0" + temp[i+1:length]
length = len(temp)
half = length >> 1
if (length & 1 == 0):
temp = temp[0:half-1] + temp[half-1]*2 +(temp[0:half-1])[::-1]
else:
temp = temp[0:half] + temp[half] +(temp[0:half])[::-1]
return temp
def needsIncrement(pal, i, j, length):
tempI = i
tempJ = j
while (i >= 0 and j < length):
if (pal[i] < pal[j]):
return True
i-=1
j+=1
while (tempI >= 0 and tempJ < length):
if (pal[tempI] != pal[tempJ]):
return False
tempI -= 1
tempJ +=1
if (tempI == -1 and tempJ == length):
return True
return False
import sys
import gc
import psyco
if __name__ == '__main__':
strip = str.strip
gc.disable()
psyco.full()
data = sys.stdin.readlines()
for i in range(1, len(data)):
input = strip(data[i])
length = len(input)
j = 0
while (j < length):
if (input[j] != '0'):
break
else:
j+=1
str = input[j:length]
if (len(str) == 0 and len(input) > 0):
print "1"
else:
print nextPalindrome1(str)
JycnCkNyZWF0ZWQgb24gMTctSnVsLTIwMTEKCkBhdXRob3I6IE5hcmVzaAonJycKCmRlZiBuZXh0UGFsaW5kcm9tZTEocGFsKToKICAgIGxlbmd0aCA9IGxlbihwYWwpCiAgICBpZiAobGVuZ3RoICYgMSA9PSAwKToKICAgICAgICBpZiBsZW5ndGggPT0gMDoKICAgICAgICAgICAgcmV0dXJuIHBhbAogICAgICAgIGhhbGYgPSBsZW5ndGggPj4gMSAKICAgICAgICBpZiAobmVlZHNJbmNyZW1lbnQocGFsLCBoYWxmIC0xLCBoYWxmLCBsZW5ndGgpKToKICAgICAgICAgICAgcmV0dXJuIGluY3JlbWVudChwYWwsIGhhbGYgLTEsIGhhbGYsIGxlbmd0aCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gcGFsWzA6aGFsZi0xXSArIHBhbFtoYWxmLTFdKjIgKyhwYWxbMDpoYWxmLTFdKVs6Oi0xXQogICAgZWxzZToKICAgICAgICBpZiBsZW5ndGggPT0gMToKICAgICAgICAgICAgaWYgKHBhbCA9PSAiOSIpOgogICAgICAgICAgICAgICAgcmV0dXJuICgxMSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBpbnQocGFsKSArIDEKICAgICAgICBoYWxmID0gbGVuZ3RoID4+IDEKICAgICAgICBpZiAobmVlZHNJbmNyZW1lbnQocGFsLCBoYWxmLCBoYWxmLCBsZW5ndGgpKToKICAgICAgICAgICAgcmV0dXJuIGluY3JlbWVudChwYWwsIGhhbGYsIGhhbGYsIGxlbmd0aCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gcGFsWzA6aGFsZl0gKyBwYWxbaGFsZl0gKyhwYWxbMDpoYWxmXSlbOjotMV0KICAgIApkZWYgaW5jcmVtZW50KHBhbCwgaSwgaiwgbGVuZ3RoKToKICAgIGlmIChsZW5ndGggJiAxID09IDApOgogICAgICAgIHRlbXAgPSBwYWxbMDppXSArIHBhbFtpXSoyICsocGFsWzA6aV0pWzo6LTFdCiAgICBlbHNlOgogICAgICAgIHRlbXAgPSBwYWxbMDppXSArIHBhbFtpXSArKHBhbFswOmldKVs6Oi0xXQogICAgaW50UGFsID0gaW50KHBhbCkKICAgIHdoaWxlIChpbnQodGVtcCkgPD0gaW50UGFsKToKICAgICAgICBpbmRleCA9IGkKICAgICAgICB3aGlsZShpbmRleCA+PSAwKToKICAgICAgICAgICAgaWYgKHRlbXBbaW5kZXhdICE9ICI5Iik6CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgaW5kZXggLT0gMQogICAgICAgIGlmIChpbmRleCA9PSAtMSk6CiAgICAgICAgICAgIHRlbXAgPSAiMSIgKyAoIjAiICogKGopKSArIHRlbXBbajpsZW5ndGhdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdGVtcCA9IHRlbXBbMDppbmRleF0gKyBgaW50KHRlbXBbaW5kZXhdKSArIDFgICsgKGkgLSBpbmRleCkqIjAiICsgdGVtcFtpKzE6bGVuZ3RoXQogICAgICAgIGxlbmd0aCA9IGxlbih0ZW1wKQogICAgICAgIGhhbGYgPSBsZW5ndGggPj4gMQogICAgICAgIGlmIChsZW5ndGggJiAxID09IDApOgogICAgICAgICAgICB0ZW1wID0gdGVtcFswOmhhbGYtMV0gKyB0ZW1wW2hhbGYtMV0qMiArKHRlbXBbMDpoYWxmLTFdKVs6Oi0xXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRlbXAgPSB0ZW1wWzA6aGFsZl0gKyB0ZW1wW2hhbGZdICsodGVtcFswOmhhbGZdKVs6Oi0xXQogICAgcmV0dXJuIHRlbXAKCmRlZiBuZWVkc0luY3JlbWVudChwYWwsIGksIGosIGxlbmd0aCk6CiAgICB0ZW1wSSA9IGkKICAgIHRlbXBKID0gagogICAgCiAgICB3aGlsZSAoaSA+PSAwIGFuZCBqIDwgbGVuZ3RoKToKICAgICAgICBpZiAocGFsW2ldIDwgcGFsW2pdKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBpLT0xCiAgICAgICAgais9MQoKICAgIHdoaWxlICh0ZW1wSSA+PSAwIGFuZCB0ZW1wSiA8IGxlbmd0aCk6CiAgICAgICAgaWYgKHBhbFt0ZW1wSV0gIT0gcGFsW3RlbXBKXSk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHRlbXBJIC09IDEKICAgICAgICB0ZW1wSiArPTEKICAgICAgICAKICAgIGlmICh0ZW1wSSA9PSAtMSBhbmQgdGVtcEogPT0gbGVuZ3RoKToKICAgICAgICByZXR1cm4gVHJ1ZQogICAgcmV0dXJuIEZhbHNlCmltcG9ydCBzeXMKaW1wb3J0IGdjCmltcG9ydCBwc3ljbwppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgc3RyaXAgPSBzdHIuc3RyaXAKICAgIGdjLmRpc2FibGUoKQogICAgcHN5Y28uZnVsbCgpCiAgICBkYXRhID0gc3lzLnN0ZGluLnJlYWRsaW5lcygpCiAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4oZGF0YSkpOgogICAgICAgIGlucHV0ID0gc3RyaXAoZGF0YVtpXSkKICAgICAgICBsZW5ndGggPSBsZW4oaW5wdXQpCiAgICAgICAgaiA9IDAKICAgICAgICB3aGlsZSAoaiA8IGxlbmd0aCk6CiAgICAgICAgICAgIGlmIChpbnB1dFtqXSAhPSAnMCcpOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGorPTEKICAgICAgICBzdHIgPSBpbnB1dFtqOmxlbmd0aF0KICAgICAgICBpZiAobGVuKHN0cikgPT0gMCBhbmQgbGVuKGlucHV0KSA+IDApOgogICAgICAgICAgICBwcmludCAiMSIKICAgICAgICBlbHNlOgogICAgICAgICAgICBwcmludCBuZXh0UGFsaW5kcm9tZTEoc3RyKQo=