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
*/