传送门

只能由字典序小的转移到字典序大的

也就是 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;
}