题意:
给出两个串和一个值k,判断第一个串能不能在每个字符以1-k的范围代替成第二个串,字符与代替的串是一一对应,但是不同的字符可有相同的代替串
思路:
枚举,第一个串每个位子都由0-k个第二个串的字符代替,考虑遍每个位子的所有代替情况,如果都不行,那么就是0
如果初次则记录如果不是初次就比较
代码:
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int k, l1, l2;
char map[26][4], temp[4];
char word[20], leet[100];
int dfs(int p1, int p2) {
if(p1 == l1 && p2 == l2) return 1;
if(p1 == l1 || p2 == l2) return 0;
for(int i=0; i<k; i++) { //列举每个位替换的个数
if(p2+i < l2) {
memset(temp, 0, sizeof(temp));
for(int j=0; j<=i; j++) temp[j] = leet[p2+j];
int flag = 0;
if(!strcmp(map[word[p1]-'a'], "")) {
flag = 1;
strcpy(map[word[p1]-'a'], temp)
}
if(flag || !strcmp(map[word[p1]-'a'], temp))
if(dfs(p1+1, p2+i+1)) return 1;
if(flag) //首次
strcpy(map[word[p1]-'a'], "");//回朔
}
}
return 0;
}
int main() {
int kase;
while(cin>>kase)
while(kase--) {
cin>>k>>word>>leet;
l1 = strlen(word);
l2 = strlen(leet);
if(l2 > l1*3) {
cout<<0<<endl;
continue;
}
memset(map, 0, sizeof(map));
int a = dfs(0, 0);
cout<<a<<endl;
}
return 0;
}