USACO Ag T1 求 Hack
  • 板块学术版
  • 楼主BFSDFS123
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/2/1 10:57
  • 上次更新2023/10/24 02:15:56
查看原帖
USACO Ag T1 求 Hack
358739
BFSDFS123楼主2023/2/1 10:57

思路:找环然后判断不在环上的。

已经特判了所有字符都出现的情况,别人给我的 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;
}

2023/2/1 10:57
加载中...