شرح سؤال ۱:

      شاید آسان ترین سؤالی باشد که در مسابقات رسمی بیان دیده‌ام.(سؤال اول مسابقه تمرینی را به حساب نیاورده‌ام!!!)

این سؤال از شما می‌خواهد تا هر یک از ورودی‌ها را به شکل مقلوب (این کلمه از قلب می‌آید) آن بنویسید. مثلاً مقلوب عدد ۱۲۳ برابر است با ۳۲۱.

حل سؤال ۱

## Petak Mirror

f = open('in.in','r')
f2 = open('Output.out','w')
n = int(f.readline())    # read first line in file 'f'
for t in range(n):
    l = [i for i in f.readline()[:-1]]
    l.reverse()
    t = ''.join(l)
    f2.write(t + '\n')
f.close()
f2.close()

شرح سؤال ۲:

       یک سؤال متوسط در مسابقه که معمولاً دوستان از پس آن برآمدند.

این سؤال از شما می‌خواهد در یک گردنبند بزرگ (۱۰۰۰تایی) یک گردنبند کوچکتر را پیدا کنید. به طوری که اگر آن قسمت را از گردنبند بزرگ جدا کرده و سر و ته آن را به هم بچسبانید، دقیقاً مشابه گردنبند کوچکتر باشد. 

در این سوال مشکل اساسی این است که رشته‌ی داده شده به صورت یک گردنبند باز است که ممکن است گردنبند کوچکتر با سر و ته آن تطابق بیابد یعنی دقیقاً در رشته وجود نداشته باشد. حالت بدتر آن این است که معکوس گردنبند کوچکتر با حالت قبل یافت شود. و بدترین حالت ممکن (که علیرغم حدسم خوشبختانه در تست‌ها نبود!!!) این است که چندین حالت ناقص (و معکوس ناقص) در تست باشد و مورد ما در سر و ته گردنبند، به شکل کامل یافت شود. (که الگوریتم بنده برای این حالت ممکن است درست جواب ندهد!!!)

توضیح اجمالی (مغز) الگوریتم:

     دنبال حالتی ویژه‌ای می‌گردد که فقط یک مورد از آن در گردنبند بزرگ وجود دارد و این حالت ویژه قسمتی از گردنبند کوچکتر است و این حالت ویژه تا زمانی که یک مورد از آن یافت شود {در یک حلقه} بزرگتر (کاملتر) می‌شود. و سپس این حالت در صورت نقص با بررسی ابتدا و انتهای  محل پیداشده در گردنبند بزرگتر کامل شده و جواب بله را خواهد داد در غیر اینصورت جواب منفی است.

تصحیح:

در این روش گردنبند بزرگتر با معکوس (برگردان) خودش جمع می‌شود و گردنبند کوچکتر در آن جستجو می‌شود. (به همین راحتی)

با تشکر از علیرضا(از قم)

fi = open('in.in','r')
f2 = open('Output.out','w')
n = int(fi.readline())    # read first line in file 'f'
for t in range(n):
    g = fi.readline()[:-1]   #  داماد)  گردنبند بزرگ)
    gl = [c for c in g]
    glr =[] ; glr += gl ; glr.reverse() ; gr = ''.join(glr)
    gg = g + gr
    f = fi.readline()[:-1]   #  گردنبند عروس
    res = 'NO'
    if f in gg:
        res = 'YES'
    f2.write(res+'\n')  
    
fi.close()
f2.close()


شرح سؤال ۳:

      باز هم یک سؤال متوسط در مسابقه.

این سؤال تقریباً واضح {بیان} شده است.

سؤال از شما می‌خواهد تا برای هر خانه شمال، جنوب، شرق، و غرب آن را بررسی کرده و در صورت داشتن دید روی دریا جواب مثبت و در غیر اینصورت جواب منفی چاپ کنید.

نکته مهم: اگر به صورت معمولی برنامه را طراحی کنید با ارزش زمانی (O(n^4 روبرو خواهید بود!!!

توضیح اجمالی الگوریتم:

         در ااین الگوریتم شما بهتر است ماکسیمم های هر جهت را یافته و سپس نقاط را بررسی کنید.

global tbl

def maxl(fl,ho,rw):
    if fl == 0:
        strt, end, stp = 0, ho, 1
    else:
        strt, end, stp = ho - 1, -1, -1        
    r  = []
    for j in range(len(tbl)):
        r += [[0]]
        for i in range(strt, end, stp):
            r[-1] += [max(tbl[j][i], r[-1][-1])]
            
        r[-1].remove(0)
        if fl == 1:
            r[-1].reverse()
    return r

        
fi = open('in.in','r')
f2 = open('Output.out','w')
n = int(fi.readline())    # read first line in file 'f'


for t in range(n):
    a=[int(i) for i in fi.readline().split(' ')]
    tbl = []
    for j in range(a[0]):
        tbl += [[int(p) for p in fi.readline().split(' ')]]
    left = maxl(1, a[1], tbl[-1])
    right = maxl(0, a[1], tbl[-1])
        
    out = [[] for i in range(a[1])]                # transpose tbl
    for i in range(a[1]):                          #
        out[i] += [tbl[j][i] for j in range(a[0])] #
    tbl = out                                      #
    
    up =[[r[k] for r in maxl(0, a[0], tbl[2])] for k in range(a[0])]
    down = [[r[k] for r in maxl(1, a[0], tbl[2])] for k in range(a[0])]
    
    out = [[] for i in range(a[0])]                # re-transpose tbl
    for i in range(a[0]):                          #
        out[i] += [tbl[j][i] for j in range(a[1])] #
    tbl = out                                      #
    
    hol = 0
    for i in range(a[0]):
        for j in range(a[1]):
            if tbl[i][j] < min(right[i][j], left[i][j], up[i][j], down[i][j]):
                hol += 1
                
    f2.write(str(hol) + '\n')            
        
fi.close()
f2.close()