题意:给你A,B两个集合,将A集合的字符串任意组合,将B集合的字符串自由组合,若A,B组成的字符串可以相等,就输出S,否则输出N。
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
char str[2][50][50];
int vis[2][50][50]; //第二维指第i个字符串,第三维表示减去的长度
int num[2];
int len[2][50];
int dfs(int u,int s,int d)
{
vis[u][s][d]=1;
for(int i=0;i<num[!u];i++)
{
int len1=len[!u][i];
int len2=len[u][s]-d;
int tlen=min(len1,len2);
int tmp=1;
for(int j=0;j<tlen;j++)
if(str[!u][i][j]!=str[u][s][j+d]){
tmp=0;
break;
}
if(tmp){
if(len1==len2)
return 1;
else if(len1<len2){
if(!vis[u][s][d+tlen])
if(dfs(u,s,d+tlen)) return 1;
}
else {
if(!vis[!u][i][tlen])
if(dfs(!u,i,tlen)) return 1;
}
}
}
return 0;
}
int main()
{
int n,m,i,j;
while(~scanf("%d%d",&num[0],&num[1]))
{
for(i=0;i<num[0];i++){
scanf("%s",str[0][i]);
len[0][i]=strlen(str[0][i]);
}
for(i=0;i<num[1];i++){
scanf("%s",str[1][i]);
len[1][i]=strlen(str[1][i]);
}
bool flag=0;
memset(vis,0,sizeof(vis));
for(i=0;i<num[0];i++)
if(dfs(0,i,0))
{
flag=1;
break;
}
if(flag)
printf("S\n");
else
printf("N\n");
}
return 0;
}