#include <iostream>
#include <algorithm>
#include <vector>
#include <stdlib.h>
//#include <fstream>
using namespace std;
string cad = "the quick brown fox jumps over the lazy dog";
int tamcad = cad.size();
int cantespacios = 0;
vector<int> lugares[100];
int tamlug=0;
char reemplazos['z'+1];
void cargar()
{
cantespacios = count(cad.begin(),cad.end(),' ');
tamcad = cad.size();
bool contado[tamcad] ;
for(int i = 0 ; i<tamcad; i++)contado[i] = false;
for(int i = 0 ; i<tamcad ; i++)
if(!contado[i])
{
contado[i] = true;
lugares[tamlug].push_back(i);
for(int j = i+1 ; j<tamcad; j++)
if(cad[j]== cad[i])
{
contado[j] = true;
lugares[tamlug].push_back(j);
}
tamlug++;
}
}
bool esEncriptado(string candidato)
{
int tam = candidato.size();
if(tam != tamcad)
return false;
if(count(candidato.begin(),candidato.end(),' ') == cantespacios)
{
vector<int> lugarescandid[100];
bool contado[tamcad];
for(int i = 0 ; i<tamcad; i++)contado[i] = false;
int tamlugcandi=0;
for(int i = 0 ; i<tamcad ; i++)
if(!contado[i])
{
contado[i] = true;
lugarescandid[tamlugcandi].push_back(i);
for(int j = i+1 ; j<tamcad; j++)
if(candidato[j]== candidato[i])
{
contado[j] = true;
lugarescandid[tamlugcandi].push_back(j);
}
tamlugcandi++;
}
if(tamlugcandi!=tamlug)
return false;
for(int i = 0; i<tamlug ; i++)
{
if(lugares[i].size()!=lugarescandid[i].size())
return false;
for(int j = 0; j<lugares[i].size(); j++)
if(lugares[i][j]!=lugarescandid[i][j])
return false;
for(int j = 0; j<tamcad ; j++)
reemplazos[candidato[j]] = cad[j];
return true;
}
}
return false;
}
int main()
{
//ifstream fin("entrada.txt");
//ofstream fout("salida.txt");
cargar();
int cantcasos;
cin>> cantcasos;
string linea;
getline(cin,linea);
getline(cin,linea);
while(cantcasos--)
{
vector<string> conjunto;
while(getline(cin,linea))
if(linea.compare("")!=0)
conjunto.push_back(linea);
else
break;
bool sw = false;
for(int i = 0 ; i<conjunto.size(); i++)
if(esEncriptado(conjunto[i]))
{
sw = true;
break;
}
//cout << "tamaño del conjunto = "<< conjunto.size()<<endl;
if(sw)
{
for(int i = 0 ; i<conjunto.size(); i++)
{
//cout << "linea a reemplazar = "<< conjunto[i]<<endl;
for(int j = 0 ; j<conjunto[i].size(); j++)
cout << reemplazos[conjunto[i][j]];
cout <<""<< endl;
}
}
else
cout << "No solution."<<endl;
if(cantcasos!=0)
cout <<endl;
}
return 0;
}
domingo, 15 de abril de 2012
UVa - 850 - Crypt Kicker II
Suscribirse a:
Enviar comentarios (Atom)
No hay comentarios:
Publicar un comentario