只有6分
AC 第一个点
#include<bits/stdc++.h>
#define int long long
using namespace std;
int q, d[105];
bool search(string s, string f){
map<int, int> mp, mq;
int n = s.size();
for(int i = 0; i < n; i++){
int c, w;
if(s[i] < 'a'){
c = s[i] - 'A' + 1;
}
else{
c = s[i] - 'a' + 1 + 26;
}
if(f[i] < 'a'){
w = f[i] - 'A' + 1;
}
else{
w = f[i] - 'a' + 1 + 26;
}
mq[w]++;
if(mp.count(c) == 1 && mp[c] != w){
return 1;
}
mp[c] = w;
}
if(mq.size() == 52 && s != f){
return 1;
}
return 0;
}
vector<int> v[105];
int e = 0;
bool dfs(int x, int y){
if(x == y && e == 1){
return 1;
}
e = 1;
if(d[x] == 1 || v[x].size() != 1){
return 0;
}
d[x] = 1;
for(int i = 0; i < v[x].size(); i++){
if(!d[v[x][i]] || v[x][i] == y){
return dfs(v[x][i], y);
}
}
}
signed main(){
cin >> q;
while(q--){
string s, f;
cin >> s >> f;
if(search(s, f)){
cout << -1 << "\n";
continue;
}
memset(d, -1, sizeof(d));
int n = s.size(), cnt = 0, t[105][105];
for(int i = 0; i < s.size(); i++){
int c, w;
if(s[i] < 'a'){
c = s[i] - 'A' + 1;
}
else{
c = s[i] - 'a' + 1 + 26;
}
if(f[i] < 'a'){
w = f[i] - 'A' + 1;
}
else{
w = f[i] - 'a' + 1 + 26;
}
d[c] = 0;
if(t[c][w] || c == w){
continue;
}
t[c][w] = 1;
cnt++;
v[c].push_back(w);
}
for(int i = 1; i <= 52; i++){
if(!d[i]){
e = 0;
if(dfs(i, i)){
cnt++;
}
d[i] = 1;
}
}
cout << cnt << "\n";
}
return 0;
}
按第一篇题解思路写的,为啥不对