Problem:
Score : 200 points

Problem Statement

We have a bingo card with a 3\times3 grid. The square at the i-th row from the top and the j-th column from the left contains the number A_{i, j}.

The MC will choose N numbers, b_1, b_2, \cdots, b_N. If our bingo sheet contains some of those numbers, we will mark them on our sheet.

Determine whether we will have a bingo when the N numbers are chosen, that is, the sheet will contain three marked numbers in a row, column, or diagonal.

Constraints

All values in input are integers.

1 \leq A_{i, j} \leq 100

A_{i_1, j_1} \neq A_{i_2, j_2} ((i_1, j_1) \neq (i_2, j_2))

1 \leq N \leq 10

1 \leq b_i \leq 100

b_i \neq b_j (i \neq j)

Input

Input is given from Standard Input in the following format:

A_{1, 1} A_{1, 2} A_{1, 3}
A_{2, 1} A_{2, 2} A_{2, 3}
A_{3, 1} A_{3, 2} A_{3, 3}
N
b_1
\vdots
b_N

Output

If we will have a bingo, print Yes; otherwise, print No.

Sample Input 1

84 97 66
79 89 11
61 59 7
7
89
7
87
79
24
84
30

Sample Output 1

Yes

We will mark A_{1, 1}, A_{2, 1}, A_{2, 2}, A_{3, 3}, and complete the diagonal from the top-left to the bottom-right.

Sample Input 2

41 7 46
26 89 2
78 92 8
5
6
45
16
57
17

Sample Output 2

No

We will mark nothing.

Sample Input 3

60 88 34
92 41 43
65 73 48
10
60
43
88
11
48
73
65
41
92
34

Sample Output 3

Yes

We will mark all the squares.

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Linq;
using System.Collections.Generic;

namespace Contest
{
    class Program
    {
        static void Main(string[] args)
        {
            ABC157B();
        }

        static void ABC157A()
        {
            var N = ReadInt();
            Console.WriteLine((N + 1) / 2);
        }
        static void ABC157B()
        {
            var A1 = ReadIntN();
            var A2 = ReadIntN();
            var A3 = ReadIntN();
            var N = ReadInt();

            var A = new int[3, 3];
            for (int i = 0; i < 3; ++i)
            {
                A[0, i] = A1[i];
                A[1, i] = A2[i];
                A[2, i] = A3[i];
            }
            var B = new bool[3, 3];
            for (int i = 0; i < N; ++i)
            {
                var b = ReadInt();
                for (int j1 = 0; j1 < 3; ++j1)
                {
                    for (int j2 = 0; j2 < 3; ++j2)
                    {
                        if (A[j1, j2] == b) { B[j1, j2] = true; }
                    }
                }
            }
            bool bingo = false;
            for (int i = 0; i < 3; ++i)
            {
                if (B[0, i] && B[1, i] && B[2, i]) { bingo = true; }
                if (B[i, 0] && B[i, 1] && B[i, 2]) { bingo = true; }
            }
            if (B[0, 0] && B[1, 1] && B[2, 2]) { bingo = true; }
            if (B[2, 0] && B[1, 1] && B[0, 2]) { bingo = true; }
            Console.WriteLine(bingo ? "Yes" : "No");
        }
        static void ABC157C()
        {
            var nm = ReadIntN();
            var N = nm[0];
            var M = nm[1];
            var sc = ReadTupleLong(M);

            var has = new bool[4];
            var cand = new long[4];
            bool ok = true;
            foreach (var t in sc)
            {
                var S = t.Item1;
                var C = t.Item2;
                if (has[S])
                {
                    if (cand[S] != C) { ok = false; }
                }
                else
                {
                    has[S] = true;
                    cand[S] = C;
                }
            }
            if (!ok) { Console.WriteLine("-1");return; }
            if (N == 1)
            {
                if (has[1])
                {
                    Console.WriteLine(cand[1]);return;
                }
                else
                {
                    Console.WriteLine(0); return;
                }
            }
            if (has[1] && cand[1] == 0) { Console.WriteLine("-1"); return; }
            if (!has[1]) { cand[1] = 1; }
            if (N == 2)
            {
                Console.WriteLine(cand[1]*10+cand[2]);return;
            }
            Console.WriteLine(cand[1] * 100 + cand[2] * 10 + cand[3]);
        }
        static void ABC157D()
        {
            var nmk = ReadIntN();
            var N = nmk[0];
            var M = nmk[1];
            var K = nmk[2];
            var ab = ReadTupleLong(M);
            var cd = ReadTupleLong(K);

            Dictionary<int, HashSet<int>> friend = new Dictionary<int, HashSet<int>>();
            Dictionary<int, HashSet<int>> block = new Dictionary<int, HashSet<int>>();
            for (int i = 1; i <= N; ++i)
            {
                friend.Add(i, new HashSet<int>());
                block.Add(i, new HashSet<int>());
            }
            foreach (var t in ab)
            {
                friend[(int)t.Item1].Add((int)t.Item2);
                friend[(int)t.Item2].Add((int)t.Item1);
            }
            foreach (var t in cd)
            {
                block[(int)t.Item1].Add((int)t.Item2);
                block[(int)t.Item2].Add((int)t.Item1);
            }

            var check = new bool[N + 1];
            var cand = new int[N + 1];
            for(int i = 1; i <= N; ++i)
            {
                if (check[i]) { continue; }
                HashSet<int> bfs = new HashSet<int>();
                bfs.Add(i);
                List<int> target = new List<int>();
                target.Add(i);
                while (target.Count > 0)
                {
                    List<int> next = new List<int>();
                    foreach (var p in target)
                    {
                        foreach (var f in friend[p])
                        {
                            if (!check[f])
                            {
                                check[f] = true;
                                next.Add(f);
                                bfs.Add(f);
                            }
                        }
                    }
                    target = next;
                }
                foreach(var person in bfs)
                {
                    cand[person] = bfs.Count - 1;
                    foreach (var fr in friend[person])
                    {
                        if (bfs.Contains(fr))
                        {
                            cand[person] -= 1;
                        }
                    }
                    foreach (var bl in block[person])
                    {
                        if (bfs.Contains(bl))
                        {
                            cand[person] -= 1;
                        }
                    }
                }
            }
            Console.WriteLine(String.Join(" ", Enumerable.Range(1, N).Select(i => cand[i])));
        }
        static void ABC157E()
        {

        }
        static void ABC157F()
        {

        }

        class Util
        {
            public static readonly long P = 1000000007;

            public static long Sum(long[] array)
            {
                return Sum(array, array.Length);
            }
            public static long Sum(long[] array, int n)
            {
                long total = 0;
                for(int i = 0; i < n; ++i)
                {
                    total += array[i];
                }
                return total;
            }
            public static long Count(long[] array, long x)
            {
                return Count(array, x, array.Length);
            }
            public static long Count(long[] array, long x, int n)
            {
                long total = 0;
                for (int i = 0; i < n; ++i)
                {
                    total += (array[i] == x ? 1 : 0);
                }
                return total;
            }
            public static long[] ASum(long[] array)
            {
                var res = new long[array.Length + 1];
                for (int i = 0; i < array.Length; ++i)
                {
                    res[i + 1] = res[i] + array[i];
                }
                return res;
            }

            public static long GCD(long a, long b)
            {
                while (b > 0)
                {
                    var c = a % b;
                    a = b;
                    b = c;
                }
                return a;
            }
            public static bool IsPrime(long x)
            {
                var fact = Factorize(x);
                return fact.Count == 1 && fact.Values.ElementAt(0) == 1;
            }
            public static Dictionary<long,int> Factorize(long x)
            {
                var dict = new Dictionary<long, int>();
                long minp = 2;
                while (x > 1)
                {
                    bool ok = false;
                    for(long p = minp; p * p <= x; ++p)
                    {
                        if (x % p == 0)
                        {
                            if (!dict.ContainsKey(p))
                            {
                                dict.Add(p, 0);
                            }
                            dict[p]++;
                            minp = p;
                            x /= p;
                            ok = true;
                            break;
                        }
                    }
                    if (!ok)
                    {
                        if (!dict.ContainsKey(x)) { dict.Add(x, 0); }
                        dict[x]++;
                        break;
                    }
                }
                return dict;
            }
            public static long Inverse(long a, long p)
            {
                long b = p, c = 1, d = 0, e = 0, f = 0;
                while (b != 0)
                {
                    e = a / b;
                    f = b; b = a - e * b; a = f;
                    f = d; d = c - e * d; c = f;
                }
                c %= p;
                return c + (c < 0 ? p : 0);
            }
            public static long[] Facts(int n, long p)
            {
                var facts = new long[n + 1];
                facts[0] = 1;
                for (int i = 1; i <= n; ++i)
                {
                    facts[i] = (i * facts[i - 1]) % p;
                }
                return facts;
            }
            public static Func<int,int,long> Combin(int n, long P)
            {
                var fact = Facts(n, P);
                var inv = fact.Select(x => Inverse(x, P)).ToArray();
                return (N, M) =>
                {
                    if (N < 0 || N < M || M < 0) { return 0; }
                    return (((fact[N] * inv[M]) % P) * inv[N - M]) % P;
                };
            }

            /// <summary>
            /// Calc Combin(n,m) where n is large and m<=mMax
            /// </summary>
            public static Func<int,int,long> CombinLarge(int mMax, long p)
            {
                var inv = Enumerable.Range(0, mMax + 1).Select(x => Util.Inverse(x, Util.P)).ToArray();
                return (n, m) =>
                {
                    long mult = 1;
                    for (int i = 1; i <= m; ++i)
                    {
                        mult = (((mult * (n + 1 - i)) % Util.P) * inv[i]) % Util.P;
                    }
                    return mult;
                };
            }

            /// <summary>
            /// Calc 2^n mod p
            /// </summary>
            public static long Power2(long n, long p)
            {
                return Power(2, n, p);
            }
            public static long Power(long a, long n, long p)
            {
                long res = 1;
                long mult = a;
                for (int i = 0; i < 40; ++i)
                {
                    if ((n & ((long)1 << i)) > 0)
                    {
                        res = (res * mult) % p;
                    }
                    mult = (mult * mult) % p;
                }
                return res;
            }
        }

        static string ReadStr()
        {
            return Console.ReadLine();
        }
        static string[] ReadStrN()
        {
            return Console.ReadLine().Split(' ');
        }
        static int ReadInt()
        {
            return Convert.ToInt32(Console.ReadLine());
        }
        static int[] ReadIntN()
        {
            return Console.ReadLine().Split(' ').Select(s => Convert.ToInt32(s)).ToArray();
        }
        static long ReadLong()
        {
            return Convert.ToInt64(Console.ReadLine());
        }
        static long[] ReadLongN()
        {
            return Console.ReadLine().Split(' ').Select(s => Convert.ToInt64(s)).ToArray();
        }
        static Tuple<string, string>[] ReadTupleStr(int n)
        {
            List<Tuple<string, string>> list = new List<Tuple<string, string>>();
            for (int i = 0; i < n; ++i)
            {
                var ab = ReadStrN();
                list.Add(new Tuple<string, string>(ab[0], ab[1]));
            }
            return list.ToArray();
        }
        static Tuple<long, long>[] ReadTupleLong(int n)
        {
            List<Tuple<long, long>> list = new List<Tuple<long, long>>();
            for (int i = 0; i < n; ++i)
            {
                var ab = ReadLongN();
                list.Add(new Tuple<long, long>(ab[0], ab[1]));
            }
            return list.ToArray();
        }
        static Tuple<double, double>[] ReadTupleDouble(int n)
        {
            List<Tuple<double, double>> list = new List<Tuple<double, double>>();
            for (int i = 0; i < n; ++i)
            {
                var ab = ReadLongN();
                list.Add(new Tuple<double, double>(ab[0], ab[1]));
            }
            return list.ToArray();
        }
    }
}