记录编号 198771 评测结果 AAAAAAA
题目名称 [HAOI 2005]破译密文 最终得分 100
用户昵称 Gravatarforever 是否通过 通过
代码语言 C++ 运行时间 0.002 s
提交时间 2015-10-25 14:28:38 内存使用 2.30 MiB
显示代码纯文本
#include<cstdio>
#include<map>
#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
using namespace std;
char c[5][20005];
char s;
bool vis[300000],vist[300000];
int tot=1,n,p,len[48],Max;
int ui,uj,sum,po=1,fa[300000];
int a[20005],b[20005],gt[50][150];
map<char,int>ma;
void Get_Pre(){
	for(int i=2;i<=tot;++i)
	 for(int j=1;j<=len[i];++j)
	   gt[i][j]=++po;
}
int find(int x){
	if(fa[x]==x) return x;
	fa[x]=find(fa[x]);
	return fa[x];
}
void Get_real(){//将字符串转化为数字;
   Get_Pre();
   for(int i=1;i<=strlen(c[1]+1);++i){
	 if(c[1][i]>='0'&&c[1][i]<='9') {
			a[++ui]=c[1][i]-'0'; continue;
	 }
	 for(int j=1;j<=len[ma[c[1][i]]];++j)
        a[++ui]=gt[ma[c[1][i]]][j];
   }
   for(int i=1;i<=strlen(c[2]+1);++i){
		if(c[2][i]>='0'&&c[2][i]<='9'){
			b[++uj]=c[2][i]-'0'; continue;
		}
	 for(int j=1;j<=len[ma[c[2][i]]];++j)
        b[++uj]=gt[ma[c[2][i]]][j];
   }
}
void Work(){
	for(int i=0;i<=po;++i) fa[i]=i;
	if(ui!=uj){
		printf("0");return;
	}
	for(int i=1;i<=ui;++i){
		int yu=find(a[i]);
		int lin=find(b[i]);
		vist[a[i]]=1; vist[b[i]]=1;
		if(yu!=lin) {
			if(lin>yu) fa[lin]=yu;
			else fa[yu]=lin;
		}
	}
	for(int i=2;i<=po;++i){
		if(vist[i]){
        int x=find(i);
		if(x!=1&&x!=0)
           if(!vis[x]&&vist[i]){
			vis[x]=1;
			sum++;
	      }
		}
	}

	 if(fa[1]==0){
			printf("0"); return;
	 }
	 long long Ans=(1<<sum);
	 printf("%lld",Ans);
}
int main(){
    freopen("encrypt.in","r",stdin);
	freopen("encrypt.out","w",stdout);
    scanf("%s%s",c[1]+1,c[2]+1);
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		cin>>s;  scanf("%d",&p);
		ma[s]=++tot; len[tot]=p;
	}
	Get_real();
	Work();
}