比赛 4043级NOIP2022欢乐赛4th 评测结果 AWAAWAA
题目名称 破译密文 最终得分 71
用户昵称 ZRQ 运行时间 0.013 s
代码语言 C++ 内存使用 0.91 MiB
提交时间 2022-11-07 21:54:04
显示代码纯文本
#include<bits/stdc++.h>
#define node pair<int,int>
#define typ first
#define pos second
using namespace std;
const int N=20005;
node s[4][N];
int n,len[30],ct,cnt[4];
string ss[4];
vector<int> v; 
map<node,int> mp;
bool vis[30];
int main()
{
	freopen("encrypt.in","r",stdin);
	freopen("encrypt.out","w",stdout);
	cin>>ss[1]>>ss[2]>>n;
	char c;
	int l; 
	for(int i=1;i<=n;++i) cin>>c>>l,v.emplace_back(c-'a'),len[c-'a']=l;
	for(int t=1;t<=2;++t)
		for(int i=0;i<ss[t].size();++i)
		{
			
			if(ss[t][i]=='0'||ss[t][i]=='1') s[t][++cnt[t]]=(node){-1,ss[t][i]-'0'};
			else
			{
				vis[ss[t][i]-'a']=1;
				for(int j=1;j<=len[ss[t][i]-'a'];++j) s[t][++cnt[t]]=(node){ss[t][i]-'a',j};
			}
		}
	if(cnt[1]!=cnt[2])
	{
		puts("0");
		return 0;
	}
	mp[{-1,0}]=0;
	mp[{-1,1}]=1;
	int T=70;
	while(T--)
	{
		for(int i=1;i<=cnt[1];++i)
		{
			if(mp.count(s[1][i])&&mp.count(s[2][i])&&mp[s[1][i]]!=mp[s[2][i]])
			{
				puts("0");
				return 0;
			}
			if(mp.count(s[1][i])&&!mp.count(s[2][i]))
			{
				--len[s[2][i].typ];
				mp[s[2][i]]=mp[s[1][i]];
			}
			else if(!mp.count(s[1][i])&&mp.count(s[2][i]))
			{
				--len[s[1][i].typ];
				mp[s[1][i]]=mp[s[2][i]];
			}
		}
	}
	for(int i=0;i<26;++i) if(vis[i]) ct+=len[i];
	for(int i=1;i<=cnt[1];++i)
		if(!mp.count(s[1][i])&&s[1][i]!=s[2][i]) --ct,mp[s[1][i]]=mp[s[2][i]]=-1;
	printf("%lld\n",1ll<<ct);
	return 0;
}