// ACM-ICPC国内予選2010 F. 古い記憶 #include #include #include #include #include using namespace std; const int INF = 100000000; int d; string mes, cur; vector piece; vector connect[30][20]; vector ans; set mem[43]; int dp[43][43]; int cost[30][20]; int curdist; int getMinedit(string s, string t){ int n = s.size(), m = t.size(); int cost[43], newcost[43]; for(int i=0;i<=n;i++) cost[i] = 0; for(int j=1;j<=m;j++){ newcost[0] = j; for(int i=1;i<=n;i++){ newcost[i] = 1+min(newcost[i-1],cost[i]); newcost[i] = min(newcost[i],cost[i-1]+(s[i-1]!=t[j-1])); } memcpy(cost, newcost, sizeof(cost)); } return *min_element(cost, cost+n+1); } bool editDist(int s, int e){ for(int i=s+1;i<=e;i++){ curdist = INF; for(int j=max(1,i-d);j<=min((int)mes.size(),i+d);j++){ if(cur[i-1]==mes[j-1]) dp[i][j] = dp[i-1][j-1]; else { dp[i][j] = dp[i-1][j-1]+1; dp[i][j] = min(dp[i][j], dp[i-1][j]+1); dp[i][j] = min(dp[i][j], dp[i][j-1]+1); } curdist = min(curdist, dp[i][j]); } if(curdist > d) return false; } return true; } void dfs(int pIdx, int p1, int p2){ int len = piece[0].size(); int csize = cur.size(); if(dp[csize][mes.size()] <= d) ans.push_back(cur); int start = min(len-1, csize-p2-1); cur += string(len-1-start, ' '); int ccost = curdist; for(int i=start;i>=0;i--){ int nsize = csize+len-i; if(nsize > mes.size() + d) break; cur += ' '; for(int j=0;j d) continue; bool flag = true; for(int k=i;k> d >> n, n){ cin >> mes; piece.clear(); for(int i=0;i> str; if(getMinedit(mes, str) > d) continue; piece.push_back(str); } sort(piece.begin(), piece.end()); piece.erase(unique(piece.begin(), piece.end()), piece.end()); len = piece[0].size(); for(int i=1;i<=mes.size()+d;i++) for(int j=1;j<=mes.size()+d;j++) if(abs(i-j) > d) dp[i][j] = INF; for(int i=0;i