#include <stdio.h>
#include <string.h>
char Keys[1000][16];
char Words[40][16];
char Cipher[26];
char Trys[26];
int KeyNum;
int WordNum;
int exists(char *string, int size)
{
int i;
for(i=0; i<size; i++)
if(strcmp(Words[i],string)==0)
return 1;
return 0;
}
int compareStructure(char* a, char* b)
{
int i,j;
int length = strlen(a);
if(length == 1) return 1;
for (i=1; i<length; i++)
{
if(a[i]!=a[i-1] && b[i]==b[i-1]) return 0;
if(a[i]==a[i-1] && b[i]!=b[i-1]) return 0;
for (j=0; j<i; j++)
{
if(a[j]==a[i] && b[j]!=b[i]) return 0;
if(a[j]!=a[i] && b[j]==b[i]) return 0;
if(a[j]==a[i] && b[j]==b[i]) break;
}
}
return 1;
}
int backtrack(int index)
{
char cipherTemp[27];
char tryTemp[27];
int length = strlen(Words[index]);
int i,j,k,ok;
if(index == WordNum)
return 1;
strcpy(cipherTemp, Cipher);
strcpy(tryTemp, Trys);
for (i=0; i<KeyNum; i++)
{
if(length != strlen(Keys[i])) continue;
ok = 1;
if (compareStructure(Keys[i],Words[index]))
{
for (j=0; j<length; j++)
{
k = Words[index][j]-'a';
if (Cipher[k]=='*')
if (Trys[Keys[i][j]-'a']=='0')
{
Cipher[k] = Keys[i][j];
Trys[Keys[i][j]-'a'] = '1';
}
else ok = 0;
else
{
if(Cipher[k] != Keys[i][j])
ok = 0;
}
}
if (ok && backtrack(index+1)) return 1;
}
strcpy(Cipher,cipherTemp);
strcpy(Trys,tryTemp);
}
return 0;
}
int main()
{
int i,j;
char text[80];
int length;
char temp[16];
scanf("%d", &KeyNum);
for (i=0; i<KeyNum; i++)
scanf("%s", Keys[i]);
getchar();
while(gets(text)!=NULL)
{
if(!strcmp(text,"")) continue;
length = strlen(text);
for(i=0,WordNum=0; i<=length; i++)
{
j=0;
while(text[i]!=' ' && i<length)
temp[j++] = text[i++];
temp[j] = '\0';
if(exists(temp,WordNum)==0)
{
strcpy(Words[WordNum], temp);
WordNum++;
}
}
for(i=0; i<26; i++)
{
Cipher[i] = '*';
Trys[i] = '0';
}
backtrack(0);
for(i=0; i<length; i++)
{
printf("%c",(text[i]!=' ')?Cipher[text[i]-'a']:' ');
}
printf("\n");
}
return 0;
}
UVa 843 Crypt Kicker
最新推荐文章于 2019-09-15 20:25:09 发布