Advertisement
Guest User

Untitled

a guest
Mar 20th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.68 KB | None | 0 0
  1. [cont, posC, posF] compactar(a, izq, der, mitad, m, c)
  2.     int cont = 0;
  3.     int i = mitad;
  4.     int posC = mitad;
  5.     while (i > izq && a[i] == c)
  6.         cont++;
  7.         i--;
  8.     posC = i;
  9.     i = mitad + 1;
  10.     while (i < der && a[i] == c)
  11.         cont++;
  12.         i++;
  13.     if (posC + (m-cont) < der) // Hay espacio por la derecha
  14.         return [cont, posC, posC];
  15.     else if (posC - (m-cont) > izq) // Hay espacio por la izquierda
  16.         nuevaPosF = posC - (m-cont);
  17.         return [cont, posC, nuevaPosF];
  18.     else return [cont, posC, -1] // No hay espacio
  19.  
  20. [cont, posC, posF] DyV(a, izq, der, m, c)
  21.     if (der == izq) // Caso base --> (n == 1)
  22.         if (a[izq] == c)
  23.             if (m == 1)
  24.                 return [1, 1, 1];
  25.             else return [1, 1, -1];
  26.         else return [0, -1, -1];
  27.     else
  28.         mitad = (izq+der)/2;
  29.         solI = DyV(a, izq, mitad, m, c);
  30.         solD = DyV(a, mitad + 1, der, m, c);
  31.         if (a[mitad] == a[mitad + 1] == c) // Hay compartición
  32.             solMitad = compactar(a, izq, der, mitad, m, c);
  33.             return max(solI, solD, solMitad);
  34.         else
  35.             return max(solI, solD);
  36.            
  37. fin
  38.  
  39. [cont, posC, posF] max(int solI, int solD, int solMitad)
  40.     if (solI[cont] == solD[cont] == solMitad[cont] == 0)
  41.         return [0, -1, -1];
  42.     if (solI[cont] > solD[cont] && solI[cont] > solMitad[cont]) // La mayor es la de la izquierda
  43.         if (solI[posF] != -1) // Ya se había encontrado la subcadena de la solución
  44.             return [solI[cont], solI[posC], solI[posF]];
  45.         else // No se había encontrado la subcadena de la solución por falta de espacio. Vemos si ahora hay
  46.             if (solI[posC] + (m-posI[cont]) < der) // Hay espacio por la derecha
  47.                 return [solI[cont], solI[posC], solI[posC]];
  48.             else if (solI[posC] - (m-solI[cont]) > izq) // Hay espacio por la izquierda
  49.                 nuevaPosF = solI[posC] - (m-solI[cont]);
  50.                 return [solI[cont], solI[posC], nuevaPosF];
  51.             else return [solI[cont], solI[posC], -1] // No hay espacio
  52.     else if (solD[cont] > solI[cont] && solD[cont] > solMitad[cont]) // La mayor es la de la derecha
  53.         nuevaPosC = solD[posC] + mitad;
  54.         if (solD[posF] != -1)
  55.             nuevaPosF = solD[posF] + mitad;
  56.             return [solD[cont], nuevaPosC, nuevaPosF];
  57.         else
  58.             if (nuevaPosC + (m-posD[cont]) < der)
  59.                 return [solD[cont], nuevaPosC, nuevaPosC];
  60.             else if (nuevaPosC - (m-solD[cont]) > izq)
  61.                 nuevaPosF = nuevaPosC - (m-solD[cont]);
  62.                 return [solD[cont], nuevaPosC, nuevaPosF];
  63.             else return [solD[cont], nuevaPosC, -1];
  64.     else // La mayor es la del medio, pero ya tiene todo calculado
  65.         return [solMitad[cont], solMitad[posC], solMitad[posF]];
  66.  
  67. [cont, posC, posF] max(int solI, int solD)
  68.     if (solI[cont] == solD[cont] == 0)
  69.         return [0, -1, -1];
  70.     if (solI[cont] > solD[cont] && solI[cont] > solMitad[cont]) // La mayor es la de la izquierda
  71.         if (solI[posF] != -1) // Ya se había encontrado la subcadena de la solución
  72.             return [solI[cont], solI[posC], solI[posF]];
  73.         else // No se había encontrado la subcadena de la solución por falta de espacio. Vemos si ahora hay
  74.             if (solI[posC] + (m-posI[cont]) < der) // Hay espacio por la derecha
  75.                 return [solI[cont], solI[posC], solI[posC]];
  76.             else if (solI[posC] - (m-solI[cont]) > izq) // Hay espacio por la izquierda
  77.                 nuevaPosF = solI[posC] - (m-solI[cont]);
  78.                 return [solI[cont], solI[posC], nuevaPosF];
  79.             else return [solI[cont], solI[posC], -1] // No hay espacio
  80.     else // La mayor es la de la derecha
  81.         nuevaPosC = solD[posC] + mitad;
  82.         if (solD[posF] != -1)
  83.             nuevaPosF = solD[posF] + mitad;
  84.             return [solD[cont], nuevaPosC, nuevaPosF];
  85.         else
  86.             if (nuevaPosC + (m-posD[cont]) < der)
  87.                 return [solD[cont], nuevaPosC, nuevaPosC];
  88.             else if (nuevaPosC - (m-solD[cont]) > izq)
  89.                 nuevaPosF = nuevaPosC - (m-solD[cont]);
  90.                 return [solD[cont], nuevaPosC, nuevaPosF];
  91.             else return [solD[cont], nuevaPosC, -1];
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement