比赛 |
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;
}