[文章目录]
Description
你的任务是验证每对单词是否匹配。如果两个单词具有相同的长度,且第一个单词的每个字母可以用转换规则多次转换后变成第二个单词中对应位置的字母,则两个单词匹配。
本来想了一个tarjan缩点+拓扑的。然而正解是floyd传递闭包。处理处每个字符可及字符,然后就没啥了。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char st1[100],st2[100],c1,c2;
int n,m;
bool map[50][50];
int main()
{
scanf("%d%d",&n,&m);
int i;
for(i=1;i<=n;++i)
{
scanf("%s%s",&c1,&c2);
map[c1-'a'][c2-'a']=1;
}
int k,j;
for(k=0;k<26;++k)
for(i=0;i<26;++i)
for(j=0;j<26;j++)
if(!map[i][j]&&map[i][k]&&map[k][j]) map[i][j]=1;
for(i=0;i<26;++i) map[i][i]=1;
while(m--)
{
scanf("%s%s",st1,st2);
int len1=strlen(st1),len2=strlen(st2);
if(len1!=len2){puts("no"); continue;}
bool fl=1;
for(i=0;i<len1;++i)
{
if(!map[st1[i]-'a'][st2[i]-'a']) {fl=0; break; }
}
if(fl) puts("yes");
else puts("no");
}
return 0;
}