#include <stdio.h>
#include <stdlib.h>
/* use lowercase for crypttext, upper for known plaintext, @ for caps */
/* assumes crypttext and plaintext same length */
main (char argc, char *argv[])
	{
	char word[100];
	char crypttoplain[26];
	char plaintocrypt[26];
	char* goal;
	char cap,i,okay;

	goal=argv[1];
	if (goal[0] == '@')
		{
		goal++;
		cap=1;
		}
	else
		cap=0;
	for (i=0;i<26;i++)
		plaintocrypt[i]=crypttoplain[i]=0;
	for (i=0;goal[i];i++)
		if ('A'<=goal[i] && goal[i]<='Z')
			plaintocrypt[goal[i]-'A']=1;
  while (gets(word))
		{
		for (i=0;goal[i];i++)
			if ('a'<=goal[i] && goal[i]<='z' && crypttoplain[goal[i]-'a']>0)
				{
				plaintocrypt[crypttoplain[goal[i]-'a']-'a']=0;
				crypttoplain[goal[i]-'a']=0;
				}
		okay=1;
		if (cap)
			{
			if ('a'<=word[0] && word[0]<='z')
				okay=0;
			else
				word[0] = word[0]-'A'+'a';
			}
		else if ('A'<=word[0] && word[0]<='Z')
			okay=0;
		for (i=0;word[i] && okay;i++)
			if ('A'<=goal[i] && goal[i]<='Z')
				{
				if (word[i]-'a' != goal[i]-'A')
					okay=0;
				}
			else if (goal[i]<'a' || 'z'<goal[i])
				okay=1;
			else if (crypttoplain[goal[i]-'a']>0)
				{
				if (crypttoplain[goal[i]-'a'] != word[i])
					okay=0;
				}
			else if (plaintocrypt[word[i]-'a']>0)
				okay=0;
			else if (goal[i]==word[i]) /* condition that a can't encode a */
				okay=0;
			else
				{
				crypttoplain[goal[i]-'a']=word[i];
				plaintocrypt[word[i]-'a']=goal[i];
				}	
		if (okay)
			{
			if (cap)
				word[0] += 'A'-'a';
			printf("%s\n",word);
			}
		}
	}

