比赛 4043级NOIP2022欢乐赛4th 评测结果 AAAAAAA
题目名称 破译密文 最终得分 100
用户昵称 op_组撒头屯 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2022-11-07 19:16:50
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=10000+5;
const int M=10000*100+5;
char s1[N],s2[N];
int n,cnt=1;
int t1[M],t2[M],fa[M],len[30];
int id[30][105];
int frt(int x){
	if (fa[x]==x)return x;
	return fa[x]=frt(fa[x]);
}
int main(){
	freopen ("encrypt.in","r",stdin);
	freopen ("encrypt.out","w",stdout);
	scanf("%s%s",s1+1,s2+1);
	scanf("%d",&n);
	for (int i=1;i<=n;i++){
		char p[3];int l;
		scanf("%s%d",p,&l);
		len[p[0]-'a']=l;
	}
	int tot=0;
	for (int i=1;i<=strlen(s1+1);i++){
		int now=s1[i]-'a';
		if (isdigit(s1[i]))t1[++tot]=s1[i]-'0';
		else{
			for (int j=1;j<=len[now];j++){
				if (!id[now][j])id[now][j]=++cnt;
				t1[++tot]=id[now][j];
			}
		}
	}
	tot=0;
	for (int i=1;i<=strlen(s2+1);i++){
		int now=s2[i]-'a';
		if (isdigit(s2[i]))t2[++tot]=s2[i]-'0';
		else{
			for (int j=1;j<=len[now];j++){
				if (!id[now][j])id[now][j]=++cnt;
				t2[++tot]=id[now][j];
			}
		}
	}
	for (int i=0;i<=cnt;i++)fa[i]=i;
	for (int i=1;i<=tot;i++){
		int x=frt(t1[i]),y=frt(t2[i]);
		if (x==y)continue;
		fa[x]=y;
	}
	int x=frt(0),y=frt(1);
	if (x==y)printf("0\n");
	else{
		long long ans=1; 
		for (int i=0;i<=cnt;i++){
			if (fa[i]!=i)continue;
			if (i!=x&&i!=y)ans<<=1;
		}
		printf("%lld\n",ans);
	}
	return 0;
}