#include #include #include #include #include using namespace std; int memo[10005]; int n; vector, vector > > v; int backtrack[10005]; int dp(int index){ if(index == n){ return 0; } if(memo[index] != -1){ return memo[index]; } int res = 0; vector a1; vector b1; for (int i = index+1; i < v.size() ; i++) { if(v[i].first.first == v[index].first.first + 1){ bool ok = false; bool moze = true; a1 = v[i].second; b1 = v[index].second; for (int j = 0; j < 26; j++) { if(a1[j] != b1[j] && ok == false){ if(abs(a1[j] - b1[j]) == 1){ ok = true; } else moze = false; } else if(a1[j] != b1[j] && ok == true){ moze = false; break; } } if(moze){ if(res < dp(i) + 1) { res = dp(i) + 1; backtrack[index] = i; } } } } return memo[index] = res; } int main() { cin >> n; memset(backtrack, -1, sizeof backtrack); for(int i = 0; i < n; i++) { string s; cin >> s; vector cnt(26, 0); for(int j = 0; j < s.size(); j++) { cnt[s[j] - 'A']++; } v.push_back(make_pair(make_pair(s.size(), s), cnt)); } sort(v.begin(), v.end()); memset(memo, -1,sizeof memo); int result = 0, start_id = 0; for(int i =0 ; i < n; i++) { if(v[i].first.first == 2) { if(result < dp(i)) { result = dp(i) + 1; start_id = i; } } } // cout << result << endl; if(result <= 1) { cout << 1 << "\n"; cout << "A" << endl; return 0; } vector ans; ans.push_back(string() + v[start_id].first.second[0]); int A = start_id; while(A != -1) { ans.push_back(v[A].first.second); A = backtrack[A]; } if(ans[0].size() == ans[1].size()) { ans.erase(ans.begin()); } cout << ans.size() << "\n"; for(int i = 0; i < ans.size(); i++) { cout << ans[i] << "\n"; } return 0; }