Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- int borde(const string &a, const string &b)
- {
- string s = (a + "#" + b);
- vector <int> v(s.size());
- for(int i=1, j=0; i<s.size(); i++)
- {
- while(j && (s[i] != s[j]))
- j = v[j - 1];
- if(s[i] == s[j])
- j++;
- v[i] = j;
- }
- int lb = v.back();
- for(int i=a.size(); i<s.size(); i++)
- lb = max(lb, v[i]);
- ///Si lo contuve completamente en algún punto, devuelvo lb.
- ///Sino devuelvo el maximo sufijo que coincide con el prefijo
- return (lb == a.size() ? lb : v.back());
- }
- int main()
- {
- vector <string> v(3);
- vector <int> p = {0, 1, 2};
- cin >> v[0] >> v[1] >> v[2];
- int minTam = 500000;
- for(int x=0; x<6; x++)
- {
- vector <string> s = v;
- for(int i=0; i<2; i++)
- {
- int b = borde(s[p[i]], s[p[i+1]]);
- ///Si alguno está contenido dentro de otro...
- if(b == s[p[i]].size())
- continue;
- ///b es el tam del prefijo de s[p[i]] que es igual al sufijo de s[p[i+1]]
- for(int j=b; j<s[p[i]].size(); j++)
- s[p[i+1]] += s[p[i]][j];
- }
- int z = s[p.back()].size();
- minTam = min(minTam, z);
- next_permutation(p.begin(), p.end());
- }
- cout << minTam << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment