题目链接.
题意:给出一个字符串
s
s
s为需要输入的密码,请构造出一个
26
26
26个英文字母的排列,使得每次输入密码最多只需要移动至相邻单元格。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
char s[205];
int f[28];
struct node
{
int id,v;
}a[28];
bool cmp(node a,node b)
{
return a.v<b.v;
}
void solve()
{
memset(f,0,sizeof f);
for(int i=0;i<26;i++)a[i].id=i,a[i].v=1000;
cin>>s+1;
int n=strlen(s+1);
int l=50,r=50;
a[s[1]-'a'].v=50;
f[s[1]-'a']=1;
for(int i=2;i<=n;i++)
{
int id=s[i]-'a';
int id2=s[i-1]-'a';
//原来不存在
if(f[id]==0)
{
f[id]=1;
//添加至最右边
if(a[id2].v==r)
{
r++;a[id].v=r;
}
//添加至最左边
else if(a[id2].v==l)
{
l--;a[id].v=l;
}
//都不能添加
else
{
cout<<"NO\n";
return;
}
}
else
{
if(abs(a[id].v-a[id2].v)>1)
{
cout<<"NO\n";
return ;
}
}
}
sort(a,a+26,cmp);
cout<<"YES\n";
for(int i=0;i<26;i++)cout<<char(a[i].id+'a');
cout<<"\n";
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int t;cin>>t;
while(t--)solve();
return 0;
}