开始一直有错误原因在于疏忽了文件片断并不对称,所以需要尝试片断1加片断2和片断2加片断1两种结果。但是我的解法不够简明,在网上看到一个好的解法,一起贴在下面:
#include <iostream> #include <sstream> #include <fstream> #include <string> #include <vector> #include <queue> #include <map> #include <set> #include <stack> #include <assert.h> #include <algorithm> #include <math.h> #include <ctime> #include <functional> #include <string.h> #include <stdio.h> #include <numeric> #include <float.h> using namespace std; struct Frag { string value; Frag(string v) : value(v) {} }; bool operator<(Frag f1, Frag f2) { return f1.value.size() < f2.value.size(); } bool solution(vector<Frag> &vf, int len, int pos, vector<bool> &visited, string &s) { if (pos == vf.size()) return true; int beg = pos; pos = -1; for (int i = beg; i < vf.size(); i++) { if (!visited[i]) { pos = i; break; } } if (pos == -1) return true; visited[pos] = true; for (int i = pos + 1; i < vf.size(); i++) { if (visited[i] || vf[pos].value.size() + vf[i].value.size() != len) continue; if (pos == 0) { s = vf[pos].value + vf[i].value; visited[i] = true; if (solution(vf, len, pos + 1, visited, s)) return true; s = vf[i].value + vf[pos].value; if (solution(vf, len, pos + 1, visited, s)) return true; visited[i] = false; } else if (((vf[pos].value + vf[i].value) == s) || (vf[i].value + vf[pos].value) == s) { visited[i] = true; if (solution(vf, len, pos + 1, visited, s)) return true; visited[i] = false; } } visited[pos] = false; return false; } int main() { int TC = 0; cin >> TC; cin.get(); cin.get(); bool blank = false; for (int tc = 0; tc < TC; tc++) { vector<Frag> vf; string s; while (getline(cin, s) && !s.empty()) { vf.push_back(Frag(s)); } sort(vf.begin(), vf.end()); if (blank) cout << endl; blank = true; vector<bool> visited(vf.size(), false); solution(vf, vf[0].value.size() + vf.back().value.size(), 0, visited, s); cout << s << endl; } return 0; }
#include <iostream> #include <sstream> #include <map> #include <string> #include <vector> using namespace std; int main() { string s; getline(cin, s); size_t T; istringstream ss(s); ss >> T; // Skip the first empty line. getline(cin, s); while ( T-- ) { vector<string> fragments; while (getline(cin, s) && !s.empty()) { ss.clear(); ss.str(s); string fragment; ss >> fragment; fragments.push_back(fragment); } // Consider all concatenations of any two strings. map<string, int> memo; for (size_t i = 0; i < fragments.size(); ++i) for (size_t j = i + 1; j < fragments.size(); ++j) { ++memo[fragments[i] + fragments[j]]; ++memo[fragments[j] + fragments[i]]; } // Search for the string of highest count. map<string, int>::iterator iter(memo.begin()); map<string, int>::iterator file(memo.begin()); for (; iter != memo.end(); ++iter) { if (iter->second > file->second) file = iter; } cout << file->first << endl; if (T) cout << endl; } return 0; }