/* Fri Nov 26 15:32:12 JST 2004 */ /* Fri Nov 26 16:06:37 JST 2004 */ #include #include #include #include using namespace std; int n, d; string names[200]; set deriv_names[200]; void setinsert_deleted(set &nameset, const string original) { for (int i = 0; i < original.length(); i++) { nameset.insert(original.substr(0, i) + original.substr(i+1)); } } void setinsert_inserted(set &nameset, const string original) { for (int i = 0; i < original.length(); i++) { for (char c = 'a'; c <= 'z'; c++) { nameset.insert(original.substr(0, i) + c + original.substr(i)); } } } void setinsert_swapped(set &nameset, const string original) { for (int i = 0; i < original.length()-1; i++) { nameset.insert(original.substr(0, i) + original[i+1] + original[i] + original.substr(i+2)); } } void setinsert_replaced(set &nameset, const string original) { for (int i = 0; i < original.length(); i++) { for (char c = 'a'; c <= 'z'; c++) { nameset.insert(original.substr(0, i) + c + original.substr(i+1)); } } } int main() { while (true) { cin >> n; if (n == 0) { break; } cin >> d; for (int i = 0; i < n; i++) { cin >> names[i]; } sort(names, names+n); for (int i = 0; i < n; i++) { deriv_names[i].clear(); setinsert_deleted(deriv_names[i], names[i]); setinsert_inserted(deriv_names[i], names[i]); setinsert_swapped(deriv_names[i], names[i]); setinsert_replaced(deriv_names[i], names[i]); deriv_names[i].erase(names[i]); } if (d == 1) { int n_found = 0; for (int i = 0; i < n; i++) { for (int j = i+1; j < n; j++) { if (deriv_names[i].find(names[j]) != deriv_names[i].end()) { n_found++; cout << names[i] << "," << names[j] << endl; } } } cout << n_found << endl; } if (d == 2) { int n_found = 0; for (int i = 0; i < n; i++) { for (int j = i+1; j < n; j++) { bool found = false; set::iterator p = deriv_names[i].begin(); set::iterator q = deriv_names[j].begin(); while (p != deriv_names[i].end() && q != deriv_names[j].end()) { if (*p < *q) { p++; } else if (*p > *q) { q++; } else { found = true; n_found++; break; } } if (found) { cout << names[i] << "," << names[j] << endl; } } } cout << n_found << endl; } } return 0; }