求大佬DEBUG
查看原帖
求大佬DEBUG
945370
MineCraftLittlePea楼主2025/6/23 13:48
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int LETTERS = 26;
int from[LETTERS];
int p[LETTERS];
vector<int> in[LETTERS];
bool vis[LETTERS];
int firstnumber;
int ans;
void dfs(int x) {
	if (x == -1) return ;
	if (vis[x]) {
		if (x == firstnumber) ans++;
		return ;
	}
	vis[x] = true;
	dfs(from[x]);
}
signed main() {
	int T;
//	cin >> T;
	T = 1;
	while (T--) {
		int n;
		string s,t;
		ans = 0;
		bool f = false;
		cin >> n >> s >> t;
		memset(from,-1,sizeof from);
		memset(p,false,sizeof p);
		for (int i = 0; i < n; i++) {
			if (from[s[i] - 'a'] != -1 && from[s[i] - 'a'] != t[i] - 'a') {
				f = true;
				break;
			}
			from[s[i] - 'a'] = t[i] - 'a';
			p[t[i] - 'a'] = true;
		}
		if (f) {
			cout << "-1\n";
			continue;
		}
		int cnt = 0;
		for (int i = 0; i < LETTERS; i++) cnt += p[i];
		if (cnt == LETTERS && s != t) {
			cout << "-1\n";
			continue;
		}
		for (int i = 0; i < LETTERS; i++) in[i].clear();
		for (int i = 0; i < LETTERS; i++) {
			if (from[i] == i) from[i] = -1;
			ans += from[i] != -1;
			in[from[i]].push_back(i);
		}
		memset(vis,false,sizeof vis);
		for (int i = 0; i < LETTERS; i++) {
			if (in[i].size() >= 2 && !vis[i]) dfs(i);
		}
		for (int i = 0; i < LETTERS; i++) {
			if (!vis[i]) {
				firstnumber = i;
				dfs(i);
			}
		}
		cout << ans << endl;
	}
	return 0;
}
2025/6/23 13:48
加载中...