#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