求助P9013 [USACO23JAN] Find and Replace S
  • 板块灌水区
  • 楼主oier25
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/5/26 16:14
  • 上次更新2024/5/26 18:32:11
查看原帖
求助P9013 [USACO23JAN] Find and Replace S
719233
oier25楼主2024/5/26 16:14
#include<bits/stdc++.h>
using namespace std;
int t,be[125],rd[125],jl[125];
string s1,s2;
void pt(){
	queue<int>q;
	for(int i='A';i<='Z';i++){
		if(rd[i]==0){
			q.push(i);
		}
	}
	for(int i='a';i<='z';i++){
		if(rd[i]==0){
			q.push(i);
		}
	}
	while(!q.empty()){
		int u=q.front();
		q.pop();
		jl[u]=1;
		int v=be[u];
		if(!jl[v]){
			q.push(v);
			rd[v]=0;
		}
	}
}
void dfs(int u){
	jl[u]=1;
	int v=be[u];
	if(!jl[v]){
		dfs(v);
	}
}
int main(){
	cin>>t;
	for(int i=1;i<=t;i++){
		set<char>b;
		cin>>s1>>s2;
		bool f=1;
		memset(be,0,sizeof(be));
		memset(jl,0,sizeof(jl));
		memset(rd,0,sizeof(rd));
		for(int i=0;i<s1.size();i++){
			b.insert(s1[i]);
			if(be[s1[i]]==0||be[s1[i]]==s2[i]){
				be[s1[i]]=s2[i];
			}
			else f=0;
		}
		if(f==0){
			cout<<"-1\n";
			continue;
		}
		if(b.size()==26){
			if(s1==s2){
				cout<<0<<"\n";
			}
			else cout<<"-1\n";
			continue;
		}
		int ans=0;
		memset(be,0,sizeof(be));
		for(int i=0;i<s1.size();i++){
			if(be[s1[i]]==0&&s1[i]!=s2[i]){
				ans++;
				rd[s2[i]]++;
				be[s1[i]]=s2[i];
			}
		}
		pt();
		for(int i='A';i<='Z';i++){
			if(jl[i]==0){
				ans++;
				dfs(i);
			}
		}
		for(int i='a';i<='z';i++){
			if(jl[i]==0){
				ans++;
				dfs(i);
			}
		}
		cout<<ans<<"\n";
	}
	return 0;
}

AC 1~9

help

2024/5/26 16:14
加载中...