思路:找环然后判断不在环上的。
已经特判了所有字符都出现的情况,别人给我的 Hack 数据全过了 /dk
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
//#define LL_inf 1145141919810
#define ull unsigned long long
#define ll long long
using namespace std;
//#define int long long
string str1,str2;
map<char,char> mp;
bool debugNew=false;
const int Maxc=60;
int sum=52;
vector<int> G[Maxc];
int toint(char opt)
{
if('a'<=opt && opt<='z')
{
return opt-'a'+1;
}
return opt-'A'+27;
}
bool vis[Maxc];
bool allvis[Maxc];
int nowid,nowans;
void dfs(int u,int len,vector<int> now)
{
if(vis[u] && nowid==u)
{
nowans=len-1;
for(auto i:now)
{
allvis[i]=1;
}
return ;
}else if(vis[u] || allvis[u]){
return ;
}
vis[u]=1;
for(int i=0;i<(int)G[u].size();i++)
{
int v=G[u][i];
vector<int> tmp=now;
tmp.push_back(v);
dfs(v,len+1,tmp);
}
}
int fa[Maxc];
int siz[Maxc];
int get(int x)
{
return fa[x]==x?x:fa[x]=get(fa[x]);
}
void merge(int x,int y)
{
int gx=get(x),gy=get(y);
if(gx!=gy)
{
// cout<<siz[gx]<<" "<<siz[gy]<<endl;
fa[gy]=gx;
siz[gx]+=siz[gy];
}
}
map<pair<int,int>,int> mp3;
void work()
{
for(int i=1;i<=52;i++) G[i].clear();
mp.clear();
mp3.clear();
cin>>str1>>str2;
int n=str1.size();
if(str1==str2)
{
puts("0");
return ;
}
bool Wrong=false;
for(char i='a';i<='z';i++)
{
mp[(char)i]='0';
}
for(char i='A';i<='Z';i++)
{
mp[(char)i]='0';
}
for(int i=0;i<n;i++)
{
// cout<<mp[str1[i]]<<" ";
if(mp[str1[i]]=='0')
{
mp[str1[i]]=str2[i];
}else{
if(mp[str1[i]]!=str2[i])
{
Wrong=true;
break;
}
}
}
if(Wrong)
{
puts("-1");
return ;
}
map<char,int> mp2;
mp2.clear();
for(int i=0;i<n;i++)
{
mp2[str1[i]]=1;
mp2[str2[i]]=1;
}
int coutnum=mp2.size();
debugNew=false;
if(coutnum==52) debugNew=true;
// cout<<coutnum<<endl;
for(int i=0;i<n;i++)
{
if(str1[i]!=str2[i])
{
G[toint(str1[i])].push_back(toint(str2[i]));
// cout<<str1[i]<<"---->"<<str2[i]<<endl;
}
}
int cnt=0;
memset(allvis,0,sizeof(allvis));
for(int i=1;i<=sum;i++)
{
memset(vis,0,sizeof(vis));
nowid=i;
nowans=0;
vector<int> tmp;
tmp.push_back(i);
if(allvis[i]) continue;
dfs(i,1,tmp);
if(nowans==0) continue;
if(debugNew==true && nowans!=0)
{
puts("-1");
return ;
}
cnt+=nowans+1;
// cout<<nowans<<endl;
}
for(int i=1;i<=sum;i++)
{
fa[i]=i;
siz[i]=1;
}
for(int i=0;i<n;i++)
{
if(str1[i]!=str2[i] && !allvis[toint(str1[i])] && !mp3[make_pair(toint(str1[i]),toint(str2[i]))])
{
// cout<<"merge("<<toint(str1[i])<<","<<toint(str2[i])<<")\n";
merge(toint(str1[i]),toint(str2[i]));
mp3[make_pair(toint(str1[i]),toint(str2[i]))]=1;
}
}
for(int i=1;i<=sum;i++)
{
if(fa[i]==i)
{
// if(siz[i]!=1)
// {
// cout<<i<<":"<<siz[i]<<endl;
// }
cnt+=siz[i]-1;
}
}
printf("%d\n",cnt);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
work();
}
return 0;
}