#include #include #include #include #include #include #include //#include using namespace std; vectors; int n; vector > words[1005]; int dp[10005]; bool compare_two_strings(string &A, string &B) { return true; } int backtrack[10005]; int dinamicko(int i){ if(i==n){ backtrack[i] = -1; return 0; } if(dp[i] != -1) { return dp[i]; } int result=-1; int next_index = -1; vector cntA(26, 0); for(int j = 0; j < s[i].size(); j++) { cntA[s[i][j] - 'A']++; } int k = s[i].size(); for(int j = 0; j < words[k + 1].size(); j++) { vector cntB(26, 0); for(int l = 0; l cntB[l]) { ok = false; break; } } if(!ok) continue; int tmp = dinamicko(words[k + 1][j].second) + 1; if(tmp > result) { result = tmp; next_index = words[k + 1][j].second; } } if(next_index != -1) backtrack[i] = next_index; return dp[i] = result; } int main() { ios_base::sync_with_stdio(false); // ifstream cin("input.txt"); memset(dp, -1, sizeof dp); cin>>n; for(int i=0; i>a; // sort(a.begin(), a.end()); s.push_back(a); words[(int) a.size()].push_back(make_pair(a, i)); } // sort(s.begin(), s.end()); memset(backtrack, -1, sizeof backtrack); int result = 0; int START = 0; for(int i = 0; i < n; i++) { int tmp = dinamicko(i) + 1; if(result < tmp) { result = tmp; START = i; } } if(result <= 1) { cout << 1 << endl; cout << s[0][0] << endl; return 0; } set st; string p = ""; p += s[START][0]; vector ret; ret.push_back(p); if(s[START].size() == 1) { ret.erase(ret.begin()); } st.insert(p); while(START != -1) { st.insert(s[START]); ret.push_back(s[START]); START = backtrack[START]; } if(ret[0].size() != ret[1].size() - 1) { cout << 1 << "\nA"; return 0; } cout << st.size() << endl; for(string x : ret) { cout << x << endl; } return 0; }