之前想进行hash,发现思路非常麻烦。索性来个一一对应,找到第一个M后,扫描所有52个字母,一个字母正反各算一次,找准基准点后,用一张7*16的图进行覆盖,整张图要完全一一对应。 为了避免附近字母的干扰,先做一遍深搜,只对深搜搜过的点进行对应,其他的不管。
 #include<iostream>
#include<iostream>
 using namespace std;
using namespace std;

 char s[26][7][17]=
char s[26][7][17]=


 {
{

 
     {
{
 "111111MMM1111111",
        "111111MMM1111111",
 "11111MM1MM111111",
        "11111MM1MM111111",
 "1111MM111MM11111",
        "1111MM111MM11111",
 "111MMMMMMMMM1111",
        "111MMMMMMMMM1111",
 "11MM1111111MM111",
        "11MM1111111MM111",
 "1MMM11111111MM11",
        "1MMM11111111MM11",
 "1MM1111111111MM1"
        "1MM1111111111MM1"
 },
    },

 
     {
{
 "1MMMMMMMMMMM1111",
        "1MMMMMMMMMMM1111",
 "1MM11111111MM111",
        "1MM11111111MM111",
 "1MM11111111MM111",
        "1MM11111111MM111",
 "1MMMMMMMMMMM1111",
        "1MMMMMMMMMMM1111",
 "1MM11111111MM111",
        "1MM11111111MM111",
 "1MM11111111MM111",
        "1MM11111111MM111",
 "1MMMMMMMMMMM1111"
        "1MMMMMMMMMMM1111"
 },
    },

 
     {
{
 "11111MMMMMMMM111",
        "11111MMMMMMMM111",
 "111MM1111111MM11",
        "111MM1111111MM11",
 "11MM111111111MM1",
        "11MM111111111MM1",
 "11MM111111111111",
        "11MM111111111111",
 "11MM111111111MM1",
        "11MM111111111MM1",
 "111MM1111111MM11",
        "111MM1111111MM11",
 "11111MMMMMMMM111"
        "11111MMMMMMMM111"
 },
    },

 
     {
{
 "1MMMMMMMMMMM1111",
        "1MMMMMMMMMMM1111",
 "1MM111111111MM11",
        "1MM111111111MM11",
 "1MM1111111111MM1",
        "1MM1111111111MM1",
 "1MM1111111111MM1",
        "1MM1111111111MM1",
 "1MM1111111111MM1",
        "1MM1111111111MM1",
 "1MM111111111MM11",
        "1MM111111111MM11",
 "1MMMMMMMMMMM1111"
        "1MMMMMMMMMMM1111"
 },
    },

 
     {
{
 "1MMMMMMMMMMMM111",
        "1MMMMMMMMMMMM111",
 "1MM1111111111111",
        "1MM1111111111111",
 "1MM1111111111111",
        "1MM1111111111111",
 "1MMMMMMMMMMMM111",
        "1MMMMMMMMMMMM111",
 "1MM1111111111111",
        "1MM1111111111111",
 "1MM1111111111111",
        "1MM1111111111111",
 "1MMMMMMMMMMMM111"
        "1MMMMMMMMMMMM111"
 },
    },

 
     {
{
 "1MMMMMMMMMMMMM11",
        "1MMMMMMMMMMMMM11",
 "1MM1111111111111",
        "1MM1111111111111",
 "1MM1111111111111",
        "1MM1111111111111",
 "1MMMMMMMMMMMMM11",
        "1MMMMMMMMMMMMM11",
 "1MM1111111111111",
        "1MM1111111111111",
 "1MM1111111111111",
        "1MM1111111111111",
 "1MM1111111111111"
        "1MM1111111111111"
 },
    },

 
     {
{
 "11111MMMMMMMM111",
        "11111MMMMMMMM111",
 "111MM1111111MM11",
        "111MM1111111MM11",
 "11MM111111111MM1",
        "11MM111111111MM1",
 "11MM111111111111",
        "11MM111111111111",
 "11MM111111MMMMM1",
        "11MM111111MMMMM1",
 "111MM1111111MM11",
        "111MM1111111MM11",
 "11111MMMMMMMMM11"
        "11111MMMMMMMMM11"
 },
    },

 
     {
{
 "1MM111111111MM11",
        "1MM111111111MM11",
 "1MM111111111MM11",
        "1MM111111111MM11",
 "1MM111111111MM11",
        "1MM111111111MM11",
 "1MMMMMMMMMMMMM11",
        "1MMMMMMMMMMMMM11",
 "1MM111111111MM11",
        "1MM111111111MM11",
 "1MM111111111MM11",
        "1MM111111111MM11",
 "1MM111111111MM11"
        "1MM111111111MM11"
 },
    },

 
     {
{
 "11111MMMMMM11111",
        "11111MMMMMM11111",
 "1111111MM1111111",
        "1111111MM1111111",
 "1111111MM1111111",
        "1111111MM1111111",
 "1111111MM1111111",
        "1111111MM1111111",
 "1111111MM1111111",
        "1111111MM1111111",
 "1111111MM1111111",
        "1111111MM1111111",
 "11111MMMMMM11111"
        "11111MMMMMM11111"
 },
    },

 
     {
{
 "1111MMMMMMMM1111",
        "1111MMMMMMMM1111",
 "1111111MM1111111",
        "1111111MM1111111",
 "1111111MM1111111",
        "1111111MM1111111",
 "1111111MM1111111",
        "1111111MM1111111",
 "111MM11MM1111111",
        "111MM11MM1111111",
 "111MMM1MM1111111",
        "111MMM1MM1111111",
 "11111MMMM1111111"
        "11111MMMM1111111"
 },
    },

 
     {
{
 "11MM111111MMM111",
        "11MM111111MMM111",
 "11MM11111MMM1111",
        "11MM11111MMM1111",
 "11MM111MMM111111",
        "11MM111MMM111111",
 "11MMMMM111111111",
        "11MMMMM111111111",
 "11MM111MMM111111",
        "11MM111MMM111111",
 "11MM11111MMM1111",
        "11MM11111MMM1111",
 "11MM111111MMMM11"
        "11MM111111MMMM11"
 },
    },

 
     {
{
 "11MM111111111111",
        "11MM111111111111",
 "11MM111111111111",
        "11MM111111111111",
 "11MM111111111111",
        "11MM111111111111",
 "11MM111111111111",
        "11MM111111111111",
 "11MM111111111111",
        "11MM111111111111",
 "11MM111111111111",
        "11MM111111111111",
 "11MMMMMMMMMMMM11"
        "11MMMMMMMMMMMM11"
 },
    },

 
     {
{
 "1MM1111111111MM1",
        "1MM1111111111MM1",
 "1MMMM111111MMMM1",
        "1MMMM111111MMMM1",
 "1MM1MM1111MM1MM1",
        "1MM1MM1111MM1MM1",
 "1MM11MMMMM111MM1",
        "1MM11MMMMM111MM1",
 "1MM1111M11111MM1",
        "1MM1111M11111MM1",
 "1MM1111111111MM1",
        "1MM1111111111MM1",
 "1MM1111111111MM1"
        "1MM1111111111MM1"
 },
    },

 
     {
{
 "1MMM111111111MM1",
        "1MMM111111111MM1",
 "1MMMM11111111MM1",
        "1MMMM11111111MM1",
 "1MM1MM1111111MM1",
        "1MM1MM1111111MM1",
 "1MM11MM111111MM1",
        "1MM11MM111111MM1",
 "1MM1111MM1111MM1",
        "1MM1111MM1111MM1",
 "1MM111111MMM1MM1",
        "1MM111111MMM1MM1",
 "1MM11111111MMMM1"
        "1MM11111111MMMM1"
 },
    },

 
     {
{
 "11111MMMMMM11111",
        "11111MMMMMM11111",
 "111MMM1111MMM111",
        "111MMM1111MMM111",
 "11MMM111111MMM11",
        "11MMM111111MMM11",
 "1MM1111111111MM1",
        "1MM1111111111MM1",
 "11MMM111111MMM11",
        "11MMM111111MMM11",
 "111MMM1111MMM111",
        "111MMM1111MMM111",
 "11111MMMMMM11111"
        "11111MMMMMM11111"
 },
    },

 
     {
{
 "1MMMMMMMMMMM1111",
        "1MMMMMMMMMMM1111",
 "1MM111111111MM11",
        "1MM111111111MM11",
 "1MM1111111111MM1",
        "1MM1111111111MM1",
 "1MM111111111MM11",
        "1MM111111111MM11",
 "1MMMMMMMMMMM1111",
        "1MMMMMMMMMMM1111",
 "1MM1111111111111",
        "1MM1111111111111",
 "1MM1111111111111"
        "1MM1111111111111"
 },
    },

 
     {
{
 "11111MMMMMM11111",
        "11111MMMMMM11111",
 "111MMM1111MMM111",
        "111MMM1111MMM111",
 "11MMM111111MMM11",
        "11MMM111111MMM11",
 "1MM1111111111MM1",
        "1MM1111111111MM1",
 "11MMM1MMMM1MMM11",
        "11MMM1MMMM1MMM11",
 "111MMM11MMMMM111",
        "111MMM11MMMMM111",
 "111111MMMM1MMMM1"
        "111111MMMM1MMMM1"
 },
    },

 
     {
{
 "1MMMMMMMMMMM1111",
        "1MMMMMMMMMMM1111",
 "1MM111111111MM11",
        "1MM111111111MM11",
 "1MM1111111111MM1",
        "1MM1111111111MM1",
 "1MM111111111MM11",
        "1MM111111111MM11",
 "1MMMMMMMMMMM1111",
        "1MMMMMMMMMMM1111",
 "1MM11111111MM111",
        "1MM11111111MM111",
 "1MM111111111MMM1"
        "1MM111111111MMM1"
 },
    },

 
     {
{
 "1111MMMMMMMM1111",
        "1111MMMMMMMM1111",
 "111MM1111111MM11",
        "111MM1111111MM11",
 "11MMM1111111MMM1",
        "11MMM1111111MMM1",
 "1111MMMMM1111111",
        "1111MMMMM1111111",
 "1MMM111MMMM11111",
        "1MMM111MMMM11111",
 "111MMM11111MMM11",
        "111MMM11111MMM11",
 "11111MMMMMMM1111"
        "11111MMMMMMM1111"
 },
    },

 
     {
{
 "11MMMMMMMMMMMM11",
        "11MMMMMMMMMMMM11",
 "11MMMMMMMMMMMM11",
        "11MMMMMMMMMMMM11",
 "1111111MM1111111",
        "1111111MM1111111",
 "1111111MM1111111",
        "1111111MM1111111",
 "1111111MM1111111",
        "1111111MM1111111",
 "1111111MM1111111",
        "1111111MM1111111",
 "1111111MM1111111"
        "1111111MM1111111"
 },
    },

 
     {
{
 "1MM1111111111MM1",
        "1MM1111111111MM1",
 "1MM1111111111MM1",
        "1MM1111111111MM1",
 "1MM1111111111MM1",
        "1MM1111111111MM1",
 "1MM1111111111MM1",
        "1MM1111111111MM1",
 "1MMM11111111MMM1",
        "1MMM11111111MMM1",
 "1MMM11111111MMM1",
        "1MMM11111111MMM1",
 "111MMMMMMMMMM111"
        "111MMMMMMMMMM111"
 },
    },

 
     {
{
 "1MMMM111111MMMM1",
        "1MMMM111111MMMM1",
 "11MMM111111MMM11",
        "11MMM111111MMM11",
 "11MMM111111MMM11",
        "11MMM111111MMM11",
 "111MMM1111MMM111",
        "111MMM1111MMM111",
 "1111MMM11MMM1111",
        "1111MMM11MMM1111",
 "11111MM11MM11111",
        "11111MM11MM11111",
 "111111MMMM111111"
        "111111MMMM111111"
 },
    },

 
     {
{
 "1MM1111111111MM1",
        "1MM1111111111MM1",
 "1MM1111111111MM1",
        "1MM1111111111MM1",
 "11MM111MM111MM11",
        "11MM111MM111MM11",
 "11MM111MM111MM11",
        "11MM111MM111MM11",
 "11MM111MM111MM11",
        "11MM111MM111MM11",
 "11MM1MM11MM1MM11",
        "11MM1MM11MM1MM11",
 "111MMM1111MMM111"
        "111MMM1111MMM111"
 },
    },

 
     {
{
 "11MMM111111MMM11",
        "11MMM111111MMM11",
 "111MMM1111MMM111",
        "111MMM1111MMM111",
 "1111MMM11MMM1111",
        "1111MMM11MMM1111",
 "111111MMMM111111",
        "111111MMMM111111",
 "1111MMM11MMM1111",
        "1111MMM11MMM1111",
 "111MMM1111MMM111",
        "111MMM1111MMM111",
 "11MMM111111MMM11"
        "11MMM111111MMM11"
 },
    },

 
     {
{
 "11MMM111111MMM11",
        "11MMM111111MMM11",
 "111MMM1111MMM111",
        "111MMM1111MMM111",
 "1111MMM11MMM1111",
        "1111MMM11MMM1111",
 "111111MMMM111111",
        "111111MMMM111111",
 "1111111MM1111111",
        "1111111MM1111111",
 "1111111MM1111111",
        "1111111MM1111111",
 "1111111MM1111111"
        "1111111MM1111111"
 },
    },

 
     {
{
 "111MMMMMMMMMM111",
        "111MMMMMMMMMM111",
 "1111111111MM1111",
        "1111111111MM1111",
 "111111111MM11111",
        "111111111MM11111",
 "11111111MM111111",
        "11111111MM111111",
 "111111MM11111111",
        "111111MM11111111",
 "11111MM111111111",
        "11111MM111111111",
 "111MMMMMMMMMMM11"
        "111MMMMMMMMMMM11"
 },
    },
 };
};

 int n,m;
int n,m;
 char rs[26][7][17];
char rs[26][7][17];
 char map[1000][1000];
char map[1000][1000];
 int dp[30];
int dp[30];

 int dir[8][2]=
int dir[8][2]= {
{ {-1,0},
{-1,0}, {1,0},
{1,0}, {0,-1},
{0,-1}, {0,1},
{0,1}, {-1,-1},
{-1,-1}, {1,-1},
{1,-1}, {-1,1},
{-1,1}, {1,1}};
{1,1}};
 int v[1000][1000];
int v[1000][1000];
 bool god(int x,int y)
bool god(int x,int y)


 {
{

 if(x>=0&&x<n&&y>=0&&y<m)
    if(x>=0&&x<n&&y>=0&&y<m)
 return true;
        return true;
 else
    else
 return false;
        return false;
 }
}
 int num=0;
int num=0;
 void dfs(int x,int y)
void dfs(int x,int y)


 {
{
 v[x][y]=num;
    v[x][y]=num;
 int i;
    int i;
 for(i=0;i<8;i++)
    for(i=0;i<8;i++)

 
     {
{
 int nx=x+dir[i][0];
        int nx=x+dir[i][0];
 int ny=y+dir[i][1];
        int ny=y+dir[i][1];
 if(god(nx,ny)&&map[nx][ny]=='M'&&v[nx][ny]==0)
        if(god(nx,ny)&&map[nx][ny]=='M'&&v[nx][ny]==0)
 dfs(nx,ny);
            dfs(nx,ny);
 }
    }
 }
}
 void init()
void init()


 {
{

 int i,j,k;
    int i,j,k;
 for(i=0;i<26;i++)
    for(i=0;i<26;i++)
 for(j=0;j<7;j++)
        for(j=0;j<7;j++)
 for(k=0;k<16;k++)
            for(k=0;k<16;k++)

 
             {
{
 rs[i][j][k]=s[i][6-j][15-k];
                rs[i][j][k]=s[i][6-j][15-k];
 }
            }
 }
}

 bool match(int x,int y,int i)
bool match(int x,int y,int i)


 {
{
 int flag=1;
    int flag=1;
 int sx=0,sy=0;
    int sx=0,sy=0;
 int j,k;
    int j,k;
 for(j=0;j<16;j++)
    for(j=0;j<16;j++)

 
     {
{

 if(s[i][0][j]=='M')
        if(s[i][0][j]=='M') {sx=x;sy=y-j;break;}
{sx=x;sy=y-j;break;}
 }
    }
 for(j=0;j<7;j++)
    for(j=0;j<7;j++)

 
     {
{

 for(k=0;k<16;k++)
        for(k=0;k<16;k++)

 
         {
{

 if((s[i][j][k]=='M'&&map[sx+j][sy+k]!='M')||(v[sx+j][sy+k]==num&&s[i][j][k]!='M'&&map[sx+j][sy+k]=='M') )
            if((s[i][j][k]=='M'&&map[sx+j][sy+k]!='M')||(v[sx+j][sy+k]==num&&s[i][j][k]!='M'&&map[sx+j][sy+k]=='M') )

 
             {
{
 flag=0;
                flag=0;
 break;
                break;
 }
            }
 }
        }
 }
    }
 if(flag==1)
    if(flag==1)
 return true;
        return true;
 for(j=0;j<16;j++)
    for(j=0;j<16;j++)

 
     {
{

 if(rs[i][0][j]=='M')
        if(rs[i][0][j]=='M') {sx=x;sy=y-j;break;}
{sx=x;sy=y-j;break;}
 }
    }

 for(j=0;j<7;j++)
    for(j=0;j<7;j++)

 
     {
{
 for(k=0;k<16;k++)
        for(k=0;k<16;k++)

 
         {
{
 if(  (rs[i][j][k]=='M'&&map[sx+j][sy+k]!='M')||(v[sx+j][sy+k]==num&&rs[i][j][k]!='M'&&map[sx+j][sy+k]=='M'))
            if(  (rs[i][j][k]=='M'&&map[sx+j][sy+k]!='M')||(v[sx+j][sy+k]==num&&rs[i][j][k]!='M'&&map[sx+j][sy+k]=='M')) 
 return false;
                return false;
 
                
 }
        }
 }
    }
 return true;
    return true;
 }
}
 void input()
void input()


 {
{

 int i;
    int i;
 for(i=0;i<n;i++)
    for(i=0;i<n;i++)
 scanf("%s",map[i]);
        scanf("%s",map[i]);
 }
}

 int main()
int main()


 {
{
 init();
    init();
 while(scanf("%d%d",&n,&m)!=EOF)
    while(scanf("%d%d",&n,&m)!=EOF)

 
     {
{
 num=0;
        num=0;
 memset(v,0,sizeof(v));
        memset(v,0,sizeof(v));
 memset(dp,0,sizeof(dp));
        memset(dp,0,sizeof(dp));
 memset(map,0,sizeof(map));
        memset(map,0,sizeof(map));
 input();
        input();

 int i,j;
        int i,j;
 for(i=0;i<n;i++)
        for(i=0;i<n;i++)

 
         {
{
 for(j=0;j<m;j++)
            for(j=0;j<m;j++)

 
             {
{

 if(map[i][j]=='M'&&v[i][j]==0)
                if(map[i][j]=='M'&&v[i][j]==0)

 
                 {
{
 num++;
                    num++;
 dfs(i,j);
                    dfs(i,j);
 int k;
                    int k;
 for(k=0;k<26;k++)
                    for(k=0;k<26;k++)

 
                     {
{
 //if(k==8)
                        //if(k==8)
 //    __asm int 3;
                        //    __asm int 3;

 if(match(i,j,k))
                        if(match(i,j,k))

 
                         {
{
 dp[k]=1;
                            dp[k]=1;
 num++;
                            num++;
 break;
                            break;
 }
                        }
 
                        
 }
                    }
 }
                }
 }
            }
 }
        }
 for(i=0;i<26;i++)
        for(i=0;i<26;i++)

 
         {
{
 if(dp[i]==1)
            if(dp[i]==1)
 printf("%c",i+'A');
                printf("%c",i+'A');
 }
        }
 printf("\n");
        printf("\n");

 }
    }
 return 0;
    return 0;
 }
}
