#include<stdio.h>
#define max 40
#define max2 1600
int principalerror(char vari[9],int conta);
int buscaerror(char vari[9],char arreglo[max2],int conta);
void buscavari(char vari[9], char arreglo[max2],int conta);
void buscafinal(char arreglo[max2],int conta);
int correcfinal(char aux);
void revisionfinal(char vari[9],int conta);
char arrefinal[9];
int w=0;
main()
{
	char var='@',cantcua='@',variables[9]="\0";
	char arre[max2]="\0";
	int contador=0,w=0,i=0,j=0,z=0,flag=-1;
	scanf("%c",&cantcua);/*Lectura de numeros de rectangulos*/
	contador=cantcua-'0';
	printf("%d\n",contador);
	getchar();
	for(w=0;w<contador;w++)/*Lectura de variables de los rectangulos*/
	{
		scanf("%c",&variables[w]);
		printf("\nVariable: %c\n",variables[w]);
		
	}
	for (i=0;i<max;i++)/*Lectura de la matriz completa*/
	{
		for (j=0;j<max;j++)
		{
			scanf("%c",&var);
			if(var>=65 && var<=90 || var>=97 && var<=122)
			{
				arre[z]=var;/*Paso de todas las variables leidas en la matriz, a un solo arreglo*/
					z++;
			}	
					
		}
	}
	if(principalerror(variables,contador)==0)
	{
		
		flag=buscaerror(variables,arre,contador);
		if (flag==0)
			printf("\nError: Las Variables ingresadas no son las correctas");
		else
		{
			buscavari(variables,arre,contador);
			buscafinal(arre,contador);
			printf("\n%s\n",arrefinal);
			revisionfinal(variables,contador);
			printf("\nLos rectangulos fueron escritos de la siguiente manera:\n");
			printf("\t\t--->>%s\n",arrefinal);
		}
	}
	else
		printf("\nError: El numero de rectangulos no coincide con la cantidad de variables\n");

	
}
int principalerror(char vari[9],int conta)
{
	int cont=0,i;
	for (i=0;vari[i]!='\0';i++)
		if(vari[i]>=65 && vari[i]<=90 || vari[i]>=97 &&  vari[i]<=122)
			cont++;
	if(conta==cont)
		return 0;
	else
		return 1;
}
int buscaerror(char vari[9],char arreglo[max2],int conta)/*Funcion que busca algun error en la escritura de los rectagunlos*/
{
	int i,k=0,flag=0;
	for (i=0;arreglo[i]!='\0';i++)
	{
		flag=0;
		for(k=0;k < conta;k++)
		{
			if(arreglo[i]==vari[k])
			{	
				flag=1;
				break;
			}
			
		}	
		if(flag==0)
			return 0;		
	}
	return -1;
}
void buscavari(char vari[9],char arreglo[max2],int conta)/*Funcion que determina si un rectangulo fue sobreescrito por completo*/
{
	int i=0,k=0,flag=0;
	for (k=0;k<conta;k++)
	{
		flag=0;
		for(i=0;arreglo[i]!='\0';i++)
		{
			if(vari[k]==arreglo[i])
			{	
				flag=1;
				break;
			}
		}	
		if (flag==0)
		{
			arrefinal[w]=vari[k];
			w++;
		}					
	}
}
void buscafinal(char arreglo[max2],int conta)/*Funcion que busca el orden de los rectangulos*/
{
	int i=0,e=-1;
	char aux='@',aux2=arreglo[0];
	for (i=0;arreglo[i]!='\0';i++)
	{
		if (arreglo[i]!=arreglo[i+1])
		{
			aux=arreglo[i];
			if(arreglo[i+1]!=arreglo[i+2])
			{
				if(aux==aux2)
				{
					e=correcfinal(aux2);
					if (e==0)
					{
						arrefinal[w]=aux2;
						w++;
					}
				}
			} 
		}	
	aux2=arreglo[i];
	}
}
int correcfinal(char aux)/*Funcion que revisa si los rectangulos encontrados en la matriz, estan insertados ya en el arreglo final*/
{
	int i=0;
	for (i=0;arrefinal[i]!='\0';i++)
	{
		if (aux==arrefinal[i])
			return 1;
	}
	return 0;
}
void revisionfinal(char vari[9],int conta)/*Funcion que revisa el orden de los rectangulos, e inserta los solitarios*/
{
	int i=0,flag=0,k=0;
	for (i=0;i<conta;i++)
	{
		flag=0;
		for(k=0;arrefinal[k]!='\0';k++)
		{
			if(vari[i]==arrefinal[k])
			{
				flag=1;
				break;			
			}
		}
		if(flag==0)
		{
			arrefinal[w]=vari[i];
			w++;
		}
	}
	
}

/*Eduardo Ruiz Cárdenas*/
/*Segunda tarea de programación*/
