问题
https://vjudge.net/problem/UVA-10602
分析
找到和现有单词最接近的单词
先按照字典序排序,然后找现有单词的左边邻居和右边邻居,比较距离,选择最近的一个
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long LL;
const int maxn=100+5;
int T,n;
string s[maxn];
vector<int> v;
inline int diff(string &cur,string &cur2){
int len=cur.size(),len2=cur2.size(),i=0;
for(;i<len && i<len2;++i){
if(cur[i]!=cur2[i]) break;
}
return len2-i;
}
int main(void){
scanf("%d",&T);
for(int kase=0;kase<T;++kase){
scanf("%d",&n);
v.clear();
for(int i=0;i<n;++i)
cin>>s[i];
string start=s[0];
sort(s,s+n);
int p=lower_bound(s,s+n,start)-s,cur=p;
v.push_back(p);
int L=p,R=p,ans=start.size(),ld=200,rd=200;
while(R-L<n-1){
ld=rd=200;
if(R+1<n) rd=diff(s[cur],s[R+1]);
if(L-1>=0) ld=diff(s[cur],s[L-1]);
if(rd<ld){
ans+=rd;
cur=R+1;
v.push_back(R+1);
++R;
}else {
ans+=ld;
cur=L-1;
v.push_back(L-1);
--L;
}
}
printf("%d\n",ans);
for(int i=0;i<v.size();++i){
printf("%s\n",s[v[i]].c_str());
}
}
return 0;
}