#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define INF 10000

struct NODE{ char v; int r; NODE *left, *right; };
char doc[10010], result[26][100];
int ratio[26];
NODE *p[100];
char digit[10],code[100];
int map[26], map2[26];

void dfs(NODE *cur, char *code, int l)
{
	if(cur->v) sprintf(result[cur->v-'A'],"%s\n",code);
	if(cur->left) code[l]='0',dfs(cur->left, code, l+1),code[l]=0;
	if(cur->right) code[l]='1',dfs(cur->right, code, l+1),code[l]=0;
}

int strlenc(char *s)
{
	int i, cnt=0;
	for( i = 0 ; s[i] ; i++ )
		if( '0' <= s[i]&&s[i] <= '1' ) cnt++;
	return cnt;
}
int main(void)
{
	int len, sol=0, sol2=0, i, n, min1, min2, p1, p2, c=26, cnt=0, cp;
//	FILE *inn = fopen("input.txt", "r");
//	FILE *in = fopen("output.txt", "r");
	FILE *inn = fopen("./bbs/prob/197/input.txt", "r");
	FILE *in = fopen("./bbs/prob/197/output.txt", "r");
	fscanf(inn,"%d%s",&n,doc);
	for(i=0;i<n;i++) ratio[doc[i]-'A']++;
	for(i=0;i<26;i++) if(ratio[i]){ cnt++, cp=i, p[i]=(NODE *)malloc(sizeof(NODE)), p[i]->v=i+'A', p[i]->r=ratio[i], p[i]->left=p[i]->right=0; }
	while(1)
	{
		for(i=0,min1=INF;i<c;i++) if(p[i] &&min1>p[i]->r) min1=p[i]->r, p1=i;
		for(i=0,min2=INF;i<c;i++) if(i!=p1&&p[i]&&min2>p[i]->r) min2=p[i]->r, p2=i;
		if(min1==n || min2==n ) break;
		p[c++]=(NODE *)malloc(sizeof(NODE)),p[c-1]->v=0,p[c-1]->r=p[p1]->r+p[p2]->r, p[c-1]->left=p[p1], p[c-1]->right=p[p2], p[p1]=p[p2]=0;
	}
	if(cnt==1) map2[cp+'A'] = 1;//printf("%c 0\n", cp+'A');
	else{ 
		dfs(p[c-1], code, 0);
	//	for(i=0;i<26;i++)
		//	if(result[i][0]) printf("%c %s", i+'A', result[i]);
	}
	for(i=0;i<26;i++) map2[i]=strlenc(result[i]);
	while(fscanf(in,"%s%s",digit,code)==2)
	{
//		printf("%c %d\n",digit[0],strlenc(code));
		len = strlenc(code);
		map[digit[0]-'A']=len;
	}
//	for(i=0;i<26;i++) printf("%d %d\n",map[i],map2[i]);
	for(i=0;doc[i];i++) sol+=map[doc[i]-'A'], sol2+=map2[doc[i]-'A'];
	if( cnt==1 ) sol2=n;
	if( sol == sol2 ) printf("1");
	else printf("0");;
	return 0;
}
		


