Thinking about it:
刚开始思考的时候,脑子里就觉得这道题可能有很多情况,刚开始就因为考虑不周全wa了。
后来换了一种思路,如果不能马上就直接得到答案,就一个一个字母去尝试。这样子就有点类似dfs了,比如 名字排序后排在中间的z字符串是 s1,,s2,那么第i位的字母肯定介于 s1[i] 和 s2[i] 之间,然后先判断在这里填一个字母能否得出答案。这里需注意:不能填了一个字母后就立马搜索下一个情况,因为题目首先要求是最短,所以要在不填下一个字母的情况下,把这个位置可能的字母都填上试试。发现必须要再填下一个字母时,才开始填写下一个字母。
PS:
AC后看了看网上的题解,大多是多个if分析各种情况,这样确实更直接。但在分析不清时,可以考虑一下搜索。另,思考问题时,最好先在纸上写点想法,书写过程中很有可能带来灵感!
Code:
/** * AC @ Sep 9th 2015 * Run Time : 0.000s */ #include <bits/stdc++.h> using namespace std; const int MAXN = 1000 + 50; string name[MAXN], ans; int N; bool read() { cin >> N; if (!N) { return false; } for (int i = 0; i < N; ++i) { cin >> name[i]; } return true; } bool dfs(int pos) { ans.append(1, '0'); char start, limit; start = pos < name[N/2-1].length() ? name[N/2-1][pos] : 'A'; limit = pos < name[N/2].length() ? name[N/2][pos] : 'Z'; for (char c = start; c<=limit; ++ c) { ans[ans.length()-1] = c; if (ans >= name[N/2-1] && ans < name[N/2]) { return true; } } for (char c = start; c<=limit; ++ c) { ans[ans.length()-1] = c; if (dfs(pos + 1)) { return true; } } return false; } void work() { ans = ""; sort(name, name + N); dfs(0); cout << ans << endl; } int main() { ios::sync_with_stdio(false); cin.tie(0); while (read()) { work(); } return 0; } /** * Test case: 4 ACB ABC ABB ACC 2 ABAB ABB 2 ABABC ABB */