GastonFontenla

Solución problema "Test"

Jul 11th, 2019
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.41 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. int borde(const string &a, const string &b)
  6. {
  7.     string s = (a + "#" + b);
  8.  
  9.     vector <int> v(s.size());
  10.  
  11.     for(int i=1, j=0; i<s.size(); i++)
  12.     {
  13.         while(j && (s[i] != s[j]))
  14.             j = v[j - 1];
  15.  
  16.         if(s[i] == s[j])
  17.             j++;
  18.  
  19.         v[i] = j;
  20.     }
  21.  
  22.     int lb = v.back();
  23.  
  24.     for(int i=a.size(); i<s.size(); i++)
  25.         lb = max(lb, v[i]);
  26.    
  27.     ///Si lo contuve completamente en algún punto, devuelvo lb.
  28.     ///Sino devuelvo el maximo sufijo que coincide con el prefijo
  29.    
  30.     return (lb == a.size() ? lb : v.back());
  31. }
  32.  
  33. int main()
  34. {
  35.     vector <string> v(3);
  36.     vector <int> p = {0, 1, 2};
  37.  
  38.     cin >> v[0] >> v[1] >> v[2];
  39.  
  40.     int minTam = 500000;
  41.  
  42.     for(int x=0; x<6; x++)
  43.     {
  44.         vector <string> s = v;
  45.  
  46.         for(int i=0; i<2; i++)
  47.         {
  48.             int b = borde(s[p[i]], s[p[i+1]]);
  49.  
  50.             ///Si alguno está contenido dentro de otro...
  51.             if(b == s[p[i]].size())
  52.                 continue;
  53.  
  54.             ///b es el tam del prefijo de s[p[i]] que es igual al sufijo de s[p[i+1]]
  55.             for(int j=b; j<s[p[i]].size(); j++)
  56.                 s[p[i+1]] += s[p[i]][j];
  57.         }
  58.  
  59.         int z = s[p.back()].size();
  60.         minTam = min(minTam, z);
  61.         next_permutation(p.begin(), p.end());
  62.     }
  63.  
  64.     cout << minTam << endl;
  65.  
  66.     return 0;
  67. }
Advertisement
Add Comment
Please, Sign In to add comment