Submission #1003445


Source Code Expand

using System;
using System.Text;
using System.Collections.Generic;
class Solve{
    int H,W;
    char[,] S;
    public Solve(){}
    StringBuilder sb;
    public static int Main(){
        new Solve().Run();
        return 0;
    }
    void Run(){
        sb = new StringBuilder();
        Read();
        Calc();
        Console.Write(sb.ToString());
    }
    void Calc(){
        long count = 1;
        if(H%2 == 1){
            for(int i=0;i*2+1<W;i++){
                if(S[H/2,i] != S[H/2,W-1-i]){
                    count *= 2;
                    break;
                }
            }
        }
        if(W%2 == 1){
            for(int i=0;i*2+1<H;i++){
                if(S[i,W/2] != S[H-1-i,W/2]){
                    count *= 2;
                    break;
                }
            }
        }
        bool[,] b = new bool[H/2,W/2];
        for(int i=0;i<H/2;i++){
            for(int j=0;j<W/2;j++){
                if(S[i,j] == S[H-1-i,j] && S[H-1-i,j] == S[H-1-i,W-1-j] && S[H-1-i,W-1-j] == S[i,W-1-j]){
                    b[i,j] = false;
                }
                else if((S[i,j] == S[H-1-i,j] && S[H-1-i,j] == S[H-1-i,W-1-j]) || (S[H-1-i,j] == S[H-1-i,W-1-j] && S[H-1-i,W-1-j] == S[i,W-1-j]) || (S[H-1-i,W-1-j] == S[i,W-1-j] && S[i,W-1-j] == S[i,j]) || (S[i,W-1-j] == S[i,j] && S[i,j] == S[H-1-i,j])){
                    b[i,j] = false;
                    count = count * 4 % Define.mod;
                }
                else if((S[i,j] == S[H-1-i,W-1-j] && S[H-1-i,j] == S[i,W-1-j]) || (S[i,j] == S[H-1-i,j] && S[H-1-i,W-1-j] == S[i,W-1-j]) || (S[i,j] == S[i,W-1-j] && S[H-1-i,j] == S[H-1-i,W-1-j])){
                    b[i,j] = false;
                    count = count * 6 % Define.mod;
                }
                else if(S[i,j] == S[H-1-i,j] || S[i,j] == S[i,W-1-j] || S[i,j] == S[H-1-i,W-1-j] || S[H-1-i,j] == S[H-1-i,W-1-j] || S[H-1-i,j] == S[i,W-1-j] || S[i,W-1-j] == S[H-1-i,W-1-j]){
                    b[i,j] = false;
                    count = count * 12 % Define.mod; 
                }
                else{
                    b[i,j] = true;
                    count = count * 12 % Define.mod;
                }
            }
        }
        UnionFind U = new UnionFind(H/2+W/2);
        for(int i=0;i<H/2;i++){
            for(int j=0;j<W/2;j++){
                if(b[i,j]){
                    U.Union(i,H/2+j);
                }
            }
        }
        int exp = 0;
        for(int i=0;i<H/2+W/2;i++){
            if(U.Get(i) == i){
                exp += U.Num(i)-1;
            }
        }
        for(int i=0;i<exp;i++){
            count = count * 2 % Define.mod;
        }
        sb.Append(count+"\n");
    }
    void Read(){
        string[] str = Console.ReadLine().Split(' ');
        H = int.Parse(str[0]);
        W = int.Parse(str[1]);
        S = new char[H,W];
        for(int i=0;i<H;i++){
            string s = Console.ReadLine();
            for(int j=0;j<W;j++){
                S[i,j] = s[j];
            }
        }
    }    
}
class UnionFind{
    int[] par;
    int[] num;
    public UnionFind(int n){
        par = new int[n];
        num = new int[n];
        for(int i=0;i<n;i++){
            par[i] = i;
            num[i] = 1;
        }
    }
    public int Num(int x){
        return num[Get(x)];
    }
    public void Union(int x,int y){
        int i = Get(x);
        int j = Get(y);
        if(i != j){
            num[i] += num[j];
            par[j] = i;  
        } 
    }
    public bool Same(int x,int y){
        return Get(x) == Get(y);
    }
    public int Get(int x){
        if(x != par[x]){
            par[x] = Get(par[x]);
        }
        return par[x];
    }
}
public static class Define{
    public const long mod = 1000000007;
}

Submission Info

Submission Time
Task I - Reverse Grid
User leign
Language C# (Mono 4.6.2.0)
Score 1900
Code Size 3877 Byte
Status AC
Exec Time 24 ms
Memory 3216 KB

Judge Result

Set Name sample all
Score / Max Score 0 / 0 1900 / 1900
Status
AC × 2
AC × 37
Set Name Test Cases
sample sample-01.txt, sample-02.txt
all sample-01.txt, sample-02.txt, 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-12.txt, 01-13.txt, 01-14.txt, 01-15.txt, 01-16.txt, 01-17.txt, 01-18.txt, 01-19.txt, 01-20.txt, 01-21.txt, 01-22.txt, 01-23.txt, 01-24.txt, 01-25.txt, 01-26.txt, 01-27.txt, 01-28.txt, 01-29.txt, 01-30.txt, 01-31.txt, 01-32.txt, 01-33.txt, 01-34.txt, 01-35.txt
Case Name Status Exec Time Memory
01-01.txt AC 22 ms 2960 KB
01-02.txt AC 22 ms 2960 KB
01-03.txt AC 22 ms 2960 KB
01-04.txt AC 22 ms 2960 KB
01-05.txt AC 22 ms 2960 KB
01-06.txt AC 22 ms 2960 KB
01-07.txt AC 22 ms 2960 KB
01-08.txt AC 22 ms 2960 KB
01-09.txt AC 22 ms 2960 KB
01-10.txt AC 22 ms 3216 KB
01-11.txt AC 23 ms 3216 KB
01-12.txt AC 23 ms 3216 KB
01-13.txt AC 23 ms 3216 KB
01-14.txt AC 22 ms 3088 KB
01-15.txt AC 22 ms 3088 KB
01-16.txt AC 24 ms 3216 KB
01-17.txt AC 23 ms 3216 KB
01-18.txt AC 23 ms 3216 KB
01-19.txt AC 23 ms 3216 KB
01-20.txt AC 23 ms 3216 KB
01-21.txt AC 24 ms 3216 KB
01-22.txt AC 22 ms 2960 KB
01-23.txt AC 23 ms 3088 KB
01-24.txt AC 23 ms 3216 KB
01-25.txt AC 23 ms 3216 KB
01-26.txt AC 23 ms 3216 KB
01-27.txt AC 22 ms 2960 KB
01-28.txt AC 22 ms 3088 KB
01-29.txt AC 22 ms 2960 KB
01-30.txt AC 22 ms 3088 KB
01-31.txt AC 23 ms 3216 KB
01-32.txt AC 23 ms 3216 KB
01-33.txt AC 23 ms 3216 KB
01-34.txt AC 23 ms 3216 KB
01-35.txt AC 24 ms 3216 KB
sample-01.txt AC 22 ms 2960 KB
sample-02.txt AC 22 ms 2960 KB