Language: C++

#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
#define REP(i,b,n) for(int i=b;i<n;i++)
#define rep(i,n)   REP(i,0,n)
#define pb push_back

#define NEWPATH 0
#define OLDPATH 1
#define SAME    2

typedef vector<string> vecs;
const int INF = (1 << 21);
int cost[10][10];
string dp[1 << 10][10];

string solve(vecs in){
  int n = in.size();
  rep(i,1 << n)
    rep(j,n)dp[i][j] = INF;
  rep(i,n)dp[1 << i][i] = in[i];

  rep(i,(1 << n)){
    rep(j,n){
      if ( (i & (1 << j)) == 0)continue;
      rep(k,n){
	if ( (i & (1 << k)) != 0)continue;
	int next = i | (1 << k);
	string nextstring = dp[i][j] + in[k].substr(in[k].size() - cost[j][k]);
	if ( nextstring.size() < dp[next][k]){
	  dp[next][k] = nextstring;
	}else if ( nextstring.size() == dp[next][k]){
		   nextstring < dp[next][k]){	   
	  dp[next][k] = nextstring;
	}
      }
    }
  }

  string ans;
  rep(i,n)ans+=in[i];
  int res = (1 << n) -1
  rep(j,n){
    if ( dp[res][i].size() < ans.size() ||
	 (dp[res][i].size() == ans.size() && dp[res][i] < ans))
      ans = dp[res][i];
  }
  
  
  ans = in[minnode] + ans;
  return ans;
}

void calc_cost(vecs in){
  int n = in.size();
  rep(i,n){
    rep(j,n){
      if ( i == j ){cost[i][j] = INF;continue;}
      cost[i][j] = in[j].size();
      rep(k,in[i].size() && k < in[j].size()){
	bool flag = true;
	rep(l,k){ 
	  if (in[i][in[i].size() - k + l] != in[j][l]){
	    flag =false;
	    break;
	  }
	}
	if ( flag == true)cost[i][j] = in[j].size() - k;
      }
    }
  }
}

vecs del(vecs in){
  vecs ret;
  rep(i,in.size()){
    bool flag = true;
    rep(j,in.size()){
      if ( i == j)continue;
      if (search(in[j].begin(),in[j].end(),in[i].begin(),in[i].end()) != in[j].end()){
	flag = false;
	break;
      }
    }
    if ( flag == true)ret.pb(in[i]);
  }
  return ret;
}



main(){
  int n;
  while(cin>>n && n ){
    vecs in;
    rep(i,n){
      string tmp;cin>>tmp;in.pb(tmp);
    }
    in = del(in);
    n = in.size();
    sort(in.begin(),in.end());
    reverse(in.begin(),in.end());
    calc_cost(in);

    cout << solve(in) << endl;
  }
  return false;
}  

Compiler output:
a.cc: In function 'std::string solve(vecs)':
a.cc:22:24: warning: overflow in conversion from 'int' to 'char' changes value from '2097152' to '0' [-Woverflow]
   22 |     rep(j,n)dp[i][j] = INF;
      |                        ^~~
a.cc:32:32: error: no match for 'operator<' (operand types are 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} and 'std::string' {aka 'std::__cxx11::basic_string<char>'})
   32 |         if ( nextstring.size() < dp[next][k]){
      |              ~~~~~~~~~~~~~~~~~ ^ ~~~~~~~~~~~
      |                             |              |
      |                             |              std::string {aka std::__cxx11::basic_string<char>}
      |                             std::__cxx11::basic_string<char>::size_type {aka long unsigned int}
In file included from /usr/include/c++/14/string:48,
                 from /usr/include/c++/14/bits/locale_classes.h:40,
                 from /usr/include/c++/14/bits/ios_base.h:41,
                 from /usr/include/c++/14/ios:44,
                 from /usr/include/c++/14/ostream:40,
                 from /usr/include/c++/14/iostream:41,
                 from a.cc:1:
/usr/include/c++/14/bits/stl_iterator.h:448:5: note: candidate: 'template<class _Iterator> constexpr bool std::operator<(const reverse_iterator<_Iterator>&, const reverse_iterator<_Iterator>&)'
  448 |     operator<(const reverse_iterator<_Iterator>& __x,
      |     ^~~~~~~~
/usr/include/c++/14/bits/stl_iterator.h:448:5: note:   template argument deduction/substitution failed:
a.cc:32:44: note:   mismatched types 'const std::reverse_iterator<_Iterator>' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'}
   32 |         if ( nextstring.size() < dp[next][k]){
      |                                            ^
/usr/include/c++/14/bits/stl_iterator.h:493:5: note: candidate: 'template<class _IteratorL, class _IteratorR> constexpr bool std::operator<(const reverse_iterator<_Iterator>&, const reverse_iterator<_IteratorR>&)'
  493 |     operator<(const reverse_iterator<_IteratorL>& __x,
      |     ^~~~~~~~
/usr/include/c++/14/bits/stl_iterator.h:493:5: note:   template argument deduction/substitution failed:
a.cc:32:44: note:   mismatched types 'const std::reverse_iterator<_Iterator>' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'}
   32 |         if ( nextstring.size() < dp[next][k]){
      |                                            ^
/usr/include/c++/14/bits/stl_iterator.h:1694:5: note: candidate: 'template<class _IteratorL, class _IteratorR> constexpr bool std::operator<(const move_iterator<_IteratorL>&, const move_iterator<_IteratorR>&)'
 1694 |     operator<(const move_iterator<_IteratorL>& __x,
      |     ^~~~~~~~
/usr/include/c++/14/bits/stl_iterator.h:1694:5: note:   template argument deduction/substitution failed:
a.cc:32:44: note:   mismatched types 'const std::move_iterator<_IteratorL>' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'}
   32 |         if ( nextstring.size() < dp[next][k]){
      |                                            ^
/usr/include/c++/14/bits/stl_iterator.h:1760:5: note: candidate: 'template<class _Iterator> constexpr bool std::operator<(const move_iterator<_IteratorL>&, const move_iterator<_IteratorL>&)'
 1760 |     operator<(const move_iterator<_Iterator>& __x,
      |     ^~~~~~~~
/usr/include/c++/14/bits/stl_iterator.h:1760:5: note:   template argument deduction/substitution failed:
a.cc:32:44: note:   mismatched types 'const std::move_iterator<_IteratorL>' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'}
   32 |         if ( nextstring.size() < dp[next][k]){
      |                                            ^
In file included from /usr/include/c++/14/bits/stl_algobase.h:64,
                 from /usr/include/c++/14/string:51:
/usr/include/c++/14/bits/stl_pair.h:1045:5: note: candidate: 'template<class _T1, class _T2> constexpr bool std::operator<(const pair<_T1, _T2>&, const pair<_T1, _T2>&)'
 1045 |     operator<(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
      |     ^~~~~~~~
/usr/include/c++/14/bits/stl_pair.h:1045:5: note:   template argument deduction/substitution failed:
a.cc:32:44: note:   mismatched types 'const std::pair<_T1, _T2>' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'}
   32 |         if ( nextstring.size() < dp[next][k]){
      |                                            ^
In file included from /usr/include/c++/14/bits/basic_string.h:47,
                 from /usr/include/c++/14/string:54:
/usr/include/c++/14/string_view:673:5: note: candidate: 'template<class _CharT, class _Traits> constexpr bool std::operator<(basic_string_view<_CharT, _Traits>, basic_string_view<_CharT, _Traits>)'
  673 |     operator< (basic_string_view<_CharT, _Traits> __x,
      |     ^~~~~~~~
/usr/include/c++/14/string_view:673:5: note:   template argument deduction/substitution failed:
a.cc:32:44: note:   mismatched types 'std::basic_string_view<_CharT, _Traits>' and 'long unsigned int'
   32 |         if ( nextstring.size() < dp[next][k]){
      |                                            ^
/usr/include/c++/14/string_view:680:5: note: candidate: 'template<class _CharT, class _Traits> constexpr bool std::operator<(basic_string_view<_CharT, _Traits>, __type_identity_t<basic_string_view<_CharT, _Traits> >)'
  680 |     operator< (basic_string_view<_CharT, _Traits> __x,
      |     ^~~~~~~~
/usr/include/c++/14/string_view:680:5: note:   template argument deduction/substitution failed:
a.cc:32:44: note:   mismatched types 'std::basic_string_view<_CharT, _Traits>' and 'long unsigned int'
   32 |         if ( nextstring.size() < dp[next][k]){
      |                                            ^
/usr/include/c++/14/string_view:688:5: note: candidate: 'template<class _CharT, class _Traits> constexpr bool std::operator<(__type_identity_t<basic_string_view<_CharT, _Traits> >, basic_string_view<_CharT, _Traits>)'
  688 |     operator< (__type_identity_t<basic_string_view<_CharT, _Traits>> __x,
      |     ^~~~~~~~
/usr/include/c++/14/string_view:688:5: note:   template argument deduction/substitution failed:
a.cc:32:44: note:   'std::__cxx11::basic_string<char>' is not derived from 'std::basic_string_view<_CharT, _Traits>'
   32 |         if ( nextstring.size() < dp[next][k]){
      |                                            ^
/usr/include/c++/14/bits/basic_string.h:3874:5: note: candidate: 'template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const __cxx11::basic_string<_CharT, _Traits, _Allocator>&, const __cxx11::basic_string<_CharT, _Traits, _Allocator>&)'
 3874 |     operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
      |     ^~~~~~~~
/usr/include/c++/14/bits/basic_string.h:3874:5: note:   template argument deduction/substitution failed:
a.cc:32:44: note:   mismatched types 'const std::__cxx11::basic_string<_CharT, _Traits, _Allocator>' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'}
   32 |         if ( nextstring.size() < dp[next][k]){
      |                                            ^
/usr/include/c++/14/bits/basic_string.h:3888:5: note: candidate: 'template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const __cxx11::basic_string<_CharT, _Traits, _Allocator>&, const _CharT*)'
 3888 |     operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
      |     ^~~~~~~~
/usr/include/c++/14/bits/basic_string.h:3888:5: note:   template argument deduction/substitution failed:
a.cc:32:44: note:   mismatched types 'const std::__cxx11::basic_string<_CharT, _Traits, _Allocator>' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'}
   32 |         if ( nextstring.size() < dp[next][k]){
      |                                            ^
/usr/include/c++/14/bits/basic_string.h:3901:5: note: candidate: 'template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const _CharT*, const __cxx11::basic_string<_CharT, _Traits, _Allocator>&)'
 3901 |     operator<(const _CharT* __lhs,
      |     ^~~~~~~~
/usr/include/c++/14/bits/basic_string.h:3901:5: note:   template argument deduction/substitution failed:
a.cc:32:44: note:   mismatched types 'const _CharT*' and 'long unsigned int'
   32 |         if ( nextstring.size() < dp[next][k]){
      |                                            ^
In file included from /usr/include/c++/14/bits/memory_resource.h:47,
                 from /usr/include/c++/14/string:68:
/usr/include/c++/14/tuple:2600:5: note: candidate: 'template<class ... _TElements, class ... _UElements> constexpr bool std::operator<(const tuple<_UTypes ...>&, const tuple<_Elements ...>&)'
 2600 |     operator<(const tuple<_TElements...>& __t,
      |     ^~~~~~~~
/usr/include/c++/14/tuple:2600:5: note:   template argument deduction/substitution failed:
a.cc:32:44: note:   mismatched types 'const std::tuple<_UTypes ...>' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'}
   32 |         if ( nextstring.size() < dp[next][k]){
      |                                            ^
In file included from /usr/include/c++/14/vector:66,
                 from a.cc:4:
/usr/include/c++/14/bits/stl_vector.h:2089:5: note: candidate: 'template<class _Tp, class _Alloc> bool std::operator<(const vector<_Tp, _Alloc>&, const vector<_Tp, _Alloc>&)'
 2089 |     operator<(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
      |     ^~~~~~~~
/usr/include/c++/14/bits/stl_vector.h:2089:5: note:   template argument deduction/substitution failed:
a.cc:32:44: note:   mismatched types 'const std::vector<_Tp, _Alloc>' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'}
   32 |         if ( nextstring.size() < dp[next][k]){
      |                                            ^
In file included from /usr/include/c++/14/bits/ios_base.h:46:
/usr/include/c++/14/system_error:324:3: note: candidate: 'bool std::operator<(const error_code&, const error_code&)'
  324 |   operator<(const error_code& __lhs, const error_code& __rhs) noexcept
      |   ^~~~~~~~
/usr/include/c++/14/system_error:324:31: no