#include #include using namespace std; #define maxn 410 int n, m, sol, tip; int t[maxn*maxn], sz[maxn*maxn]; char v[maxn*maxn], s[maxn]; set > > g; int tata(int nod) { if(t[nod]==nod) return nod; int aux=tata(t[nod]); t[nod]=aux; return aux; } void unite(int a, int b) { int t1=tata(a); int t2=tata(b); if(t1==t2) return; t[t2]=t1; sz[t1]+=sz[t2]; sol=max(sol, sz[t1]); } int main() { scanf("%d", &tip); scanf("%d%d\n", &n, &m); sol=1; for(int i=1; i<=n; ++i) { scanf("%s", s+1); for(int j=1; j<=m; ++j) v[(i-1)*m+j]=s[j]; } for(int i=1; i<=n*m; ++i) { t[i]=i; sz[i]=1; } for(int i=1; i<=n*m-1; ++i) if(v[i]==v[i+1] && i%m!=0) unite(i, i+1); for(int i=1; i<=(n-1)*m; ++i) if(v[i]==v[i+m]) unite(i, i+m); if(tip==1) { printf("%d\n", sol); return 0; } int a, b, szmax=0, rez; char cl; for(int i=1; i<=n*m; ++i) { g.clear(); if(i-1>0) { int t=tata(i-1); g.insert(make_pair(v[i-1], make_pair(t, sz[t]))); } if(i+1<=n*m) { int t=tata(i+1); g.insert(make_pair(v[i+1], make_pair(t, sz[t]))); } if(i-m>0) { int t=tata(i-m); g.insert(make_pair(v[i-m], make_pair(t, sz[t]))); } if(i+m<=n*m) { int t=tata(i+m); g.insert(make_pair(v[i+m], make_pair(t, sz[t]))); } for(char c='a'; c<='z'; ++c) { rez=1; for(set > > :: iterator it = g.begin(); it != g.end(); ++it) if(it->first==c) rez+=it->second.second; if(rez>szmax) { a=(i-1)/m+1; b=(i-1)%m+1; cl=c; szmax=rez; } } } printf("%d %d\n", a, b); printf("%c\n", cl); return 0; }