只能由字典序小的转移到字典序大的
也就是 a − > b a->b a−>b, b − > c b->c b−>c, c − > d c->d c−>d
那么可以直接暴力
只要存在有需要的 i − > i + 1 i->i+1 i−>i+1每次把所有的 i − > i + 1 i->i+1 i−>i+1
贪心
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return x*f;
}
int t,n,ans,f[35][35];
char a[100005],b[100005];
bool ok;
int main(){
t=read();
while(t--){
n=read();
scanf("%s\n%s",a,b);//读入
ok=1;
memset(f,0,sizeof(f));
ans=0;
//以上3行为初始化 ,ok表示特判
for(int i=0;i<n;i++){
if(b[i]<a[i]){//特判
puts("-1");ok=0;break;
}
else f[a[i]-'a'][b[i]-'a']++;//字符a[i]到目标状态b[i]的情况增加
}
if(!ok)continue;
//以下是贪心
for(int i=0;i<20;i++)
for(int j=0;j<20;j++){
if(i!=j&&f[i][j]){
ans++;
for(int k=j+1;k<20;k++)
if(f[i][k])f[j][k]+=f[i][k],f[i][k]=0;//转移
}
}
printf("%d\n",ans);//输出
}
return 0;
}