题目大意:
输入两行分别由空格分开的句子,第二行句子中的每个单词,看其中的字母是否能在第一行中的单词中找到,第一行中的每个单词中只能挑出一个字母且只能被匹配一次。
求解思路:
二分图求最大匹配,将两行单词组成的句子转化为二分图的匹配关系;
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
#define N 53
int y[N];
int vis[N];
int a[N][N];
char word[N];
char cube[N][N];
int res[N];
int n,m;
bool dfs(int v)
{
for(int i=0;i<m;i++)
{
if(a[v][i]&&!vis[i])
{
vis[i]=true;
if(y[i]==-1||dfs(y[i]))
{
y[i]=v;
return true;
}
}
}
return false;
}
int main()
{
//freopen("in.txt","r",stdin);
while(cin>>m>>n)
{
for(int i=0;i<m;i++)
cin>>cube[i];
memset(res,0,sizeof(res));
for(int i=0;i<n;i++)
{
cin>>word;
int slen=strlen(word);
memset(a,0,sizeof(a));
for(int j=0;j<slen;j++)
for(int k=0;k<m;k++)
{
if(strchr(cube[k],word[j])!=NULL)
{
a[j][k]=1;
}
}
int count=0;
memset(y,-1,sizeof(y));
for(int k=0;k<slen;k++)
{
memset(vis,0,sizeof(vis));
if(dfs(k))
count++;
}
if(count==slen)
res[i]=1;
}
int mark=0;
for(int i=0;i<n;i++)
{
if(res[i])
{
if(mark)
printf(" %d",i);
else
{
mark=1;
printf("%d",i);
}
}
}
if(!mark)
cout<<-1;
cout<<endl;
}
return 0;
}