记录编号 127855 评测结果 AAAAAAA
题目名称 [HAOI 2005]破译密文 最终得分 100
用户昵称 Gravatar水中音 是否通过 通过
代码语言 C++ 运行时间 0.003 s
提交时间 2014-10-16 14:03:57 内存使用 0.83 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<queue>
#include<set>
using namespace std;
long long aiky=1;
int cd[27]={0},s1cd=0,s2cd=0,jiheshu,n,m,i,p,zj1,zj2;
char x,s[20000];
bool pan[20000]={0},pan2[20000]={0},qwq=false;
queue<char> s3,s4;
queue<int> s1,s2,A;
set<int> a[20000];
set<int>::iterator B;
void init()
{
	scanf("%s",s);i=0;
	while((s[i]>='a'&&s[i]<='z')||s[i]=='0'||s[i]=='1'){s3.push(s[i]);i++;}
	scanf("%s",s);i=0;
	while((s[i]>='a'&&s[i]<='z')||s[i]=='0'||s[i]=='1'){s4.push(s[i]);i++;}
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		cin>>x;scanf("%d",&zj1);
		p=x-96;cd[p]=zj1;
	}
	while(!s3.empty())
	{
		x=s3.front();s3.pop();
		if(x=='0'||x=='1') s1.push(x-'0');
		else
		{
			p=x-96;
			for(i=1;i<=cd[p];i++)
			{zj1=p+100*i;pan2[zj1]=true;s1.push(zj1);}
		}
	}
	while(!s4.empty())
	{
		x=s4.front();s4.pop();
		if(x=='0'||x=='1') s2.push(x-'0');
		else
		{
			p=x-96;
			for(i=1;i<=cd[p];i++)
			{zj1=p+100*i;pan2[zj1]=true;s2.push(zj1);}
		}
	}
}
void Get_sum()
{
	while(!s1.empty())
	{
		zj1=s1.front();s1.pop();
		zj2=s2.front();s2.pop();
		if((zj1==1&&zj2==0)||(zj1==0&&zj2==1))
		{
			qwq=true;
			break;
		}
		a[zj1].insert(zj2);a[zj2].insert(zj1);
	}
	if(qwq) aiky=0;
	pan[0]=true;
	for(B=a[0].begin();B!=a[0].end();B++)
	{
		pan[*B]=true;
		A.push(*B);
	}
	while(!A.empty())
	{
		zj1=A.front();A.pop();
		if(zj1==1)qwq=true;
		for(B=a[zj1].begin();B!=a[zj1].end();B++)
		if(!pan[*B])
		{
			pan[*B]=true;
			A.push(*B);
		}
	}
	pan[1]=true;
	for(B=a[1].begin();B!=a[1].end();B++)
	{pan[*B]=true;A.push(*B);}
	while(!A.empty())
	{
		zj1=A.front();A.pop();
		if(zj1==0)qwq=true;
		for(B=a[zj1].begin();B!=a[zj1].end();B++)
		if(!pan[*B]){pan[*B]=true;A.push(*B);}
	}
	if(qwq) aiky=0;
	jiheshu=0;
	for(i=1;i<=26;i++)
	for(p=1;p<=cd[i];p++)
	{
		zj1=p*100+i;
		if(!pan[zj1]&&pan2[zj1])
		{
			jiheshu++;
			pan[zj1]=true;
			for(B=a[zj1].begin();B!=a[zj1].end();B++)
			{pan[*B]=true;A.push(*B);}
			while(!A.empty())
			{
				zj2=A.front();A.pop();
				for(B=a[zj2].begin();B!=a[zj2].end();B++)
				if(!pan[*B]){pan[*B]=true;A.push(*B);}
			}
		}
	}
}
int main()
{
	freopen("encrypt.in","r",stdin);
	freopen("encrypt.out","w",stdout);
	init();
	Get_sum();
	for(i=1;i<=jiheshu;i++) aiky<<=1;
	printf("%lld\n",aiky);
	return 0;
}