题目大意是给出两个字符串S1和S2,找到一个字符串S使得S1<=S &&S<S2,要求S在长度最短的情况下字典序最小
一道简单的模拟题啦,就是细节有点多,也就当做是恢复训练的练手了,毕竟为了期末考试有很久都没有碰过题目了。
我个人是分了许多种情况,然后感觉也写的比较乱糟糟的,这里只把几个坑点说一下吧
1、题目要求的是长度最短!始终记住这是第一优先级,数据是
2
ABCDEFGHIJ
AC
答案应该是ABD
2、要记住,在给某个字符+1的时候要判断一下那个字符是不是Z,数据:
2
ACZZZ
AD
2
ACZZYY
AD
答案应该是
ACZZZ
ACZZZ
总之这道题弄来弄去有点绕,因为是以长度最短为第一优先级,可能有点不适应。。。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxm=1010;
int n;
string arr[maxm],ans;
int main(){
ios_base::sync_with_stdio(0);
while(cin>>n&&n){
for(int i=1;i<=n;++i)cin>>arr[i];
sort(arr+1,arr+n+1);
int ind=0,tmp=min(arr[n>>1].size(),arr[(n>>1)+1].size());
while(ind<tmp&&arr[(n>>1)+1][ind]==arr[n>>1][ind])ans+=arr[n>>1][ind++];
if(tmp!=ind){
if(arr[n>>1].size()-ind==1)
ans+=arr[n>>1][ind];
else if(arr[(n>>1)+1].size()-ind==1&&arr[(n>>1)+1][ind]-arr[n>>1][ind]>1)
ans+=(arr[n>>1][ind]+1);
else if(arr[(n>>1)+1][ind]-arr[n>>1][ind]>1)
ans+=(arr[n>>1][ind]+1);
else{
if(arr[(n>>1)+1].size()-ind==1){
ans+=arr[n>>1][ind];
if(ind+2==arr[n>>1].size())
ans+=arr[n>>1][ind+1];
else{
++ind;
while(ind<arr[n>>1].size()&&arr[n>>1][ind]=='Z')ans+='Z',++ind;
if(ind+1<arr[n>>1].size())
ans+=(arr[n>>1][ind]+1);
else if(ind!=arr[n>>1].size())
ans+=(arr[n>>1][ind]);
}
}else
ans+=(arr[n>>1][ind]+1);
}
}
cout<<ans<<endl;
ans.clear();
}
return 0;
}