题意:有两个字符串,上面的英文字母可以由一些字符或字符串代替,但每种英文字母只能有一个映射值,不同的英文字母可以有相同的映射值,且变换后的字符串长度不超过3,问上下两个字符串可不可以是相同的。
题解:因为每个字符变换后的字符串长度不超过3,且字符串长度不超过15,直接暴力,只要有一种映射情况让他们相等,那就是可以的,否则输出0。
#include <stdio.h>
#include <string.h>
#include <map>
using namespace std;
const int N = 50;
char str1[N], str2[N];
int flag, len1, len2, k;
map<char, char *> m;
void dfs(int cur1, int cur2) {
if (flag)
return;
if (cur1 == len1 && cur2 == len2) {
flag = 1;
return;
}
if (cur1 >= len1 || cur2 >= len2)
return;
if (m[str1[cur1]]) {
char* temp = m[str1[cur1]];
int len = strlen(temp);
for (int i = 0, j = cur2; i < len; i++, j++)
if (temp[i] != str2[j])
return;
dfs(cur1 + 1, cur2 + len);
}
else {
char temp[5];
for (int i = 1; i <= k; i++) {
memset(temp, 0, sizeof(temp));
int pos = 0;
for (int j = cur2; j < cur2 + i; j++)
temp[pos++] = str2[j];
m[str1[cur1]] = temp;
dfs(cur1 + 1, cur2 + i);
m[str1[cur1]] = 0;
}
}
}
int main() {
int t;
scanf("%d", &t);
while (t--) {
m.clear();
scanf("%d%s%s", &k, str1, str2);
len1 = strlen(str1);
len2 = strlen(str2);
flag = 0;
dfs(0, 0);
if (flag)
printf("1\n");
else
printf("0\n");
}
return 0;
}