#include #include #include #include #include using namespace std; int edit_distance(string s, string t) { int d[17][17]; for(int i = 0; i <= s.length(); i++) d[i][0] = i; for(int i = 0; i <= t.length(); i++) d[0][i] = i; for(int i = 1; i <= s.length(); i++) { for(int j = 1; j <= t.length(); j++) { int d_ins = d[ i ][j-1] + 1; int d_del = d[i-1][ j ] + 1; int d_rep = d[i-1][j-1] + (s[i-1] == t[j-1] ? 0 : 1); int d_swp = d[i-1][j-1] + 1; // swap -> insert if(i >= 2 && j >= 2) { int k = j - 1; while(true) { if(s[i-2] == t[j-1] && s[i-1] == t[k-1]) { d_swp = d[i-1][j-1]; break; } if(k < 1) break; if(d[i-1][k-1] >= d[i-1][k]) break; --k; } } // delete -> swap if(i >= 2 && j >= 2) { int k = i - 1; while(true) { if(s[k-1] == t[j-1] && s[i-1] == t[j-2]) { d_swp = d[i-1][j-1]; break; } if(k < 1) break; if(d[k-1][j-1] >= d[k][j-1]) break; --k; } } d[i][j] = min(min(d_ins,d_del), min(d_rep,d_swp)); } } return d[s.length()][t.length()]; } int main(void) { ifstream cin("E.txt"); int n, d; while(cin >> n) { if(n == 0) break; cin >> d; vector s(n); for(int i = 0; i < n; i++) cin >> s[i]; sort(s.begin(), s.end()); int m = 0; for(int i = 0; i < n; i++) { for(int j = i + 1; j < n; j++) { if(edit_distance(s[i], s[j]) <= d) { cout << s[i] << "," << s[j] << endl; ++m; } } } cout << m << endl; } return 0; }