题目描述
输入一个n(2≤n≤1000,n是偶数)个字符串的集合D,找一个长度最短的字符串(不一定在D中出现)S,使得D中恰好一半串小于等于S,另一半串大于S。如果有多解,输出字典序最小的解。例如,对于{JOSEPHINE,JERRY},输出JF;对于{FRED,FREDDIE}输出FRED。字符串全部由大写字母构成。
输入
输入包含多组测试用例。
对于每一组用例,第一行包含一个正整数 n,代表字符串个数。
接下来n行每行输入一个有大写字母构成的字符串(串长不超过10000)。
一个单独的0代表输入结束。
输出
对于每一组样例,输出对应的S串。
样例输入
4
FRED
SAM
JOE
MARGARET
2
FRED
FREDDIE
2
JOSEPHINE
JERRY
2
LARHONDA
LARSEN
0
样例输出
K
FRED
JF
LARI
#include <bits/stdc++.h>
using namespace std;
int n;
const int N=1005;
string str[N];
int main()
{
while(scanf("%d",&n)!=EOF&&n)
{
for(int i=1;i<=n;i++)
{
cin>>str[i];
}
sort(str+1,str+1+n); ///将字符串进行排序
string l=str[n/2],r=str[n/2+1],ans=""; ///找到中间的两个字符串
int flag=0,cnt=0; ///cnt记录此时遍历到的l字符串的位置
while(flag==0)
{
for(int i='A';i<='Z';i++) ///第一次先将所有的字母遍历一遍 看看是否存在最小的字母符合要求
{
string t=ans;
t+=i;
if(t>=l&&t<r) {flag=1;ans=t;break;}
}
if(flag) break;
ans+=l[cnt++]; ///如果不存在单个字母大于等于l小于r的话 说明l和r的第一个字符相等
}
cout<<ans<<endl;
}
return 0;
}