题意:
给出两个字符串,第一个字符串中的每个字符(只包括小写字母)最多可以变成k(k<=3)个字符(不一定是小写字母),相同字母要变成相同的字符,问由第一个串变成第二个串合不合法。
思路:
串的长度只有15,直接暴力,用dfs+回溯去枚举所有情况。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<stack>
#include<cmath>
#include<cstdlib>
#include<climits>
#include<sstream>
using namespace std;
char st[100],en[100];
char maps[26][4],tmp[4];
int dfs(int k, int p1, int p2 ,int l1, int l2)
{
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(tmp,0,sizeof tmp);
for(int j=0;j<=i;j++)
tmp[j]=en[p2+j];
int flag=0;
if(strcmp(maps[st[p1]-'a'],"")==0)
{
flag=1;
strcpy(maps[st[p1]-'a'],tmp);
}
if(flag||strcmp(maps[st[p1]-'a'],tmp)==0)
{
if(dfs(k,p1+1,p2+i+1,l1,l2))
return 1;
}
if(flag)
strcpy(maps[st[p1]-'a'],"");
}
}
return 0;
}
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
int k;
scanf("%d%s%s",&k,st,en);
int len1=strlen(st);
int len2=strlen(en);
if(len2>3*len1)
{
cout<<0<<endl;
continue;
}
for(int i=0;i<26;++i)
strcpy(maps[i],"");
int ans=dfs(k,0,0,len1,len2);
cout<<ans<<endl;
}
return 0;
}