Problem:


  MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

blockquote {
  font-family: Menlo, Monaco, "Courier New", monospace;
  color: #333333;
  display: block;
  padding: 8.5px;
  margin: 0 0 9px;
  font-size: 12px;
  line-height: 18px;
  background-color: #f5f5f5;
  border: 1px solid #ccc;
  border: 1px solid rgba(0, 0, 0, 0.15);
  -webkit-border-radius: 4px;
  -moz-border-radius: 4px;
  border-radius: 4px;
  white-space: pre;
  white-space: pre-wrap;
  word-break: break-all;
  word-wrap: break-word;
}

Problem Statement

Let's consider operations on monochrome images that consist of hexagonal pixels, each of which is colored in either black or white.  Because of the shape of pixels, each of them has exactly six neighbors (e.g. pixels that share an edge with it.)

"Filtering" is an operation to determine the color of a pixel from the colors of itself and its six neighbors.  Examples of filterings are shown below.

Example 1: Color a pixel in white when all of its neighboring pixels are white.  Otherwise the color will not change.

Performing this operation on all the pixels simultaneously results in "noise canceling," which removes isolated black pixels.

Example 2: Color a pixel in white when its all neighboring pixels are black. Otherwise the color will not change.

Performing this operation on all the pixels simultaneously results in "edge detection," which leaves only the edges of filled areas.

Example 3: Color a pixel with the color of the pixel just below it, ignoring any other neighbors.

Performing this operation on all the pixels simultaneously results in "shifting up" the whole image by one pixel.

Applying some filter, such as "noise canceling" and "edge detection," twice to any image yields the exactly same result as if they were applied only once.
We call such filters idempotent. The "shifting up" filter is not idempotent since every repeated application shifts the image up by one pixel.

Your task is to determine whether the given filter is idempotent or not.

Input

The input consists of multiple datasets.  The number of dataset is less than $100$.
Each dataset is a string representing a filter and has the following format (without spaces between digits).

 $c_0c_1\cdots{}c_{127}$

$c_i$ is either '0' (represents black) or '1' (represents white), which indicates the output of the filter for a pixel when the binary representation of the pixel and its neighboring six pixels is $i$. 
The mapping from the pixels to the bits is as following:

and the binary representation $i$ is defined as $i = \sum_{j=0}^6{\mathit{bit}_j \times 2^j}$,
where $\mathit{bit}_j$ is $0$ or $1$ if the corresponding pixel is in black or white, respectively.
Note that the filter is applied on the center pixel, denoted as bit 3.

The input ends with a line that contains only a single "#".

Output

For each dataset, print "yes" in a line if the given filter is idempotent, or "no" otherwise (quotes are for clarity).

Sample Input

00000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000111111111
10000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111
01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101
#

Output for the Sample Input

yes
yes
no



Sample input:
00000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000111111111
10000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111
01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101
#


Sample output:
yes
yes
no

Submission status: Time Limit Exceeded

Solution code:
import math,string,itertools,fractions,heapq,collections,re,array,bisect,sys,random,time,copy,functools

sys.setrecursionlimit(10**7)
inf = 10**20
eps = 1.0 / 10**10
mod = 10**9+7
dd = [(-1,0),(0,1),(1,0),(0,-1)]
ddn = [(-1,0),(-1,1),(0,1),(1,1),(1,0),(1,-1),(0,-1),(-1,-1)]

def LI(): return [int(x) for x in sys.stdin.readline().split()]
def LI_(): return [int(x)-1 for x in sys.stdin.readline().split()]
def LF(): return [float(x) for x in sys.stdin.readline().split()]
def LS(): return sys.stdin.readline().split()
def I(): return int(sys.stdin.readline())
def F(): return float(sys.stdin.readline())
def S(): return input()
def pf(s): return print(s, flush=True)

#     18
#   17  16
# 15  06  14
#   05  04
# 13  03  12
#   02  01
# 11  00  10
#   09  08
#     07

def main():
    rr = []

    tt = [
            [3, 0, 2, 5, 6, 4, 1],
            [0, 7, 9, 2, 3, 1, 8],
            [2, 9, 11, 13, 5, 3, 0],
            [5, 2, 13 ,15, 17, 6, 3],
            [6, 3, 5, 17, 18, 16, 4],
            [4, 1, 3, 6, 16, 14, 12],
            [1, 8, 0, 3, 4, 12, 10]
    ]

    while True:
        s = S()
        if s == '#':
            break

        fil = int(s[::-1], 2)
        ii = [2**i for i in range(128)]
        m = {}
        def u(a):
            key = tuple(a)
            if key in m:
                return m[key]
            t = 0
            for i in range(7):
                if a[i]:
                    t |= ii[tt[0][i]]
            if fil & ii[t]:
                m[key] = 1
                return 1
            m[key] = 0
            return 0

        f = True
        for k in range(ii[19]):
            # if k % ii[17] == 0:
            #     print(k)
            a = [1 if k & ii[i] else 0 for i in range(19)]
            b = [u(list(map(lambda x: a[x], ta))) for ta in tt]
            if u(b) != b[0]:
                # print('false', a, b, u(b))
                f = False
                break
        if f:
            rr.append('yes')
        else:
            rr.append('no')
        # print(rr)

    return '\n'.join(rr)




print(main())

Submission status: Accepted

Solution code:
import math,string,itertools,fractions,heapq,collections,re,array,bisect,sys,random,time,copy,functools

sys.setrecursionlimit(10**7)
inf = 10**20
eps = 1.0 / 10**10
mod = 10**9+7
dd = [(-1,0),(0,1),(1,0),(0,-1)]
ddn = [(-1,0),(-1,1),(0,1),(1,1),(1,0),(1,-1),(0,-1),(-1,-1)]

def LI(): return [int(x) for x in sys.stdin.readline().split()]
def LI_(): return [int(x)-1 for x in sys.stdin.readline().split()]
def LF(): return [float(x) for x in sys.stdin.readline().split()]
def LS(): return sys.stdin.readline().split()
def I(): return int(sys.stdin.readline())
def F(): return float(sys.stdin.readline())
def S(): return input()
def pf(s): return print(s, flush=True)

#     13
#   12  11
# 13  06  13
#   05  04
# 10  03  09
#   02  01
# 13  00  13
#   08  07
#     13

def main():
    rr = []

    tt = [
            [13, 7, 8, 0, 1, 2, 3],
            [7, 13, 0, 1, 9, 3, 4],
            [8, 0, 13, 2, 3, 10, 5],
            [0, 1, 2, 3, 4, 5, 6],
            [1, 9, 3, 4, 13, 6, 11],
            [2, 3, 10, 5, 6, 13, 12],
            [3, 4, 5, 6, 11, 12, 13]
    ]

    while True:
        s = S()
        if s == '#':
            break

        fil = [int(c) for c in s]
        i2 = [2**i for i in range(128)]
        f3 = {}
        for k in range(3**7):
            a = []
            kk = k
            for _ in range(7):
                a.append(k%3)
                k //= 3
            if 2 in a:
                continue
            a.reverse()
            e = 0
            for c in a:
                e *= 2
                e += c
            f3[kk] = fil[e]

        for k in range(3**7):
            a = []
            kk = k
            for _ in range(7):
                a.append(k%3)
                k //= 3
            if 2 not in a:
                continue
            a.reverse()
            ki = a.index(2)
            e = 0
            y = 0
            for i in range(7):
                e *= 3
                y *= 3
                if i == ki:
                    y += 1
                else:
                    e += a[i]
                    y += a[i]

            fe = f3[e]
            fy = f3[y]
            if fe == fy:
                f3[kk] = fe
            else:
                f3[kk] = 2

        f = True
        for k in range(2**13):
            ba = [1 if i2[i] & k else 0 for i in range(13)] + [2]
            ca = []
            for i in range(7):
                ti = tt[i]
                e = 0
                for c in ti:
                    e *= 3
                    e += ba[c]
                ca.append(f3[e])
            y = 0
            for c in ca:
                y *= 3
                y += c
            if ca[3] != f3[y]:
                f = False
                break

        if f:
            rr.append('yes')
        else:
            rr.append('no')

    return '\n'.join(rr)




print(main())