//============================================================================
// Name : 1293.cpp
// Author : BreakDark (Jhonny Monrroy) basado en la solucion publicada en [http://www.cnblogs.com/njczy2010/p/4337078.html]
// Version : 3.0 16/09/2016
// Copyright : (Solucion obtenida de [http://www.cnblogs.com/njczy2010/p/4337078.html])
// Description : Solucion al Problema: 1293 - Document Analyzer [http://lightoj.com/]
//============================================================================
// Accepted!!! xD
#include <iostream>
#include <stdio.h>
#include <string>
#include <cstring>
#include <sstream>
#include <map>
using namespace std;
int T; // para el numero de casos de prueba
int t; // indice
/**
* Metodo procesarPalabra: reemplaza los caracteres que no son letras por
* espacios
*
* @author BreakDark (Jhonny Monrroy)
* @version 1.0 20 ago. 2016
* @param palabra
* Cadena a procesar
* @return Retorna la cadena ya proceesda
*/
string procesarPalabra(string palabra) {
string nuevaLinea = "";
char letra;
for (int i = 0; i < palabra.length(); i++) {
letra = palabra[i];
if (letra >= 'a' && letra <= 'z') {
nuevaLinea += letra;
} else {
nuevaLinea += ' ';
}
}
return nuevaLinea;
}
/**
* Metodo obtenerRangoMenor: Metodo que busca el rango menor para este
* problema
*
* @author BreakDark (Jhonny Monrroy)
* @version 1.0 20 ago. 2016
* @param vecPal
* Vector de palabras
* @param numPal
* Numero de palabras del vector
* @param hashPal
* HashMap de palabras no iguales
*/
void obtenerRangoMenor(string vecPal[], int numPal, map<string, int> hashPal) {
int p = -1;
int q = numPal + 1;
int posible_p, posible_q;
int cont = 0; // contador de palabras encontradas
posible_p = 0;
posible_q = 0;
while (posible_p < numPal) {
for (; posible_q < numPal; posible_q++) {
hashPal[vecPal[posible_q]]++;
if (hashPal[vecPal[posible_q]] == 1)
cont++;
if (cont == hashPal.size()) {
for (; posible_p <= posible_q; posible_p++) {
if (hashPal[vecPal[posible_p]] == 1) {
if (posible_q - posible_p < q - p) {
p = posible_p;
q = posible_q;
} else if (posible_q - posible_p == q - p) {
if (posible_p < p) {
p = posible_p;
q = posible_q;
}
}
hashPal[vecPal[posible_p]]--;
cont--;
posible_p++;
posible_q++;
break;
}
hashPal[vecPal[posible_p]]--;
}
break;
}
}
if (posible_q == numPal)
break;
}
printf("Case %d: %d %d\n", t, (p + 1), (q + 1));
}
int main() {
//int T; // para el numero de casos de prueba
string palabra; // para cada palabra
char linea[102]; // para la linea que se lea
string linea_s;
string palabras[50000]; // vector de palabras
int numPal; // para el numero de palabras a almacenar
map<string, int> hashPalabras; // conjunto de palabras no repetidas
// AQUI INICIA EL PROGRAMA
scanf("%d", &T);
for (t = 1; t <= T; t++) {
numPal = 0; // vaciamos el vector
hashPalabras.clear();
while (scanf("%s", linea) != EOF && strcmp(linea, "END") != 0) {
char nuevaLinea[102] = "";
char letra;
for (int i = 0; i < strlen(linea); i++) {
letra = linea[i];
if (letra >= 'a' && letra <= 'z') {
nuevaLinea[strlen(nuevaLinea)] = letra;
} else {
strcat(nuevaLinea, " ");
}
}
strcpy(linea, nuevaLinea);
//cout<<linea<<endl;
char *vecPalabras;
vecPalabras = strtok(linea, " ");
while (vecPalabras != NULL) {
//printf("%s\n", vecPalabras);
palabras[numPal] = vecPalabras;
stringstream ss;
ss << palabras[numPal];
ss >> linea_s;
hashPalabras[linea_s] = 0; // seleccionamos palabras distintas
numPal++;
vecPalabras = strtok(NULL, " ");
}
}
obtenerRangoMenor(palabras, numPal, hashPalabras);
}
return 0;
}
Blog dedicado a la publicación de artículos, programas propios, traducciones de Roms de Nes, super Nes y mas, y alguno que otro artículo sobre tecnologia.
Thursday, September 15, 2016
Solucion al Problema: 1293 - Document Analyzer [http://lightoj.com/] con C++
Para ver el link del problema Click aqui
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment