domingo, 15 de abril de 2012

UVa - 850 - Crypt Kicker II

#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;
}

No hay comentarios:

Publicar un comentario