本文已参与「新人创作礼」活动,一起开启掘金创作之路。
单点时限: 2.0 sec
内存限制: 512 MB
有两个只由小写字母组成的长度为n的字符串s1,s2和m组字母对应关系,每一组关系由两个字母c1和c2组成,代表c1可以直接变成c2,你需要判断s1是否可以通过这m组关系转换为s2。
输入格式
第一行输入一个n(1≤n≤100),代表字符串的长度。
第二行和第三行输入两个字符串s1,s2。
第四行输入一个m(1≤m≤325),代表有m组关系。
接下来m行,第i行两个字符ui,vi,代表ui可以直接变为vi。输出格式
如果s1可以通过这些m组关系转化变为s2,输出”YES”,否则输出”NO”。
样例
input
6 aabbcc cdbcad 4 a c c a a d b c
output
YES
提示
可以转换多次,比如a可以转换为b,而b可以转换为c,则a可以转换为c。
样例一:aabbcc->cabbcc->cdbbcc->cdbccc->cdbcac->cdbcaa->cdbcad
题意:s1可以通过m组关系转化变为s2,输出yes。。。
ac代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char a[440],b[440];
int s[440][440]; ///标记
int main()
{
int n;
scanf("%d",&n);
scanf("%s %s",a,b);
int m;
scanf("%d",&m);
char c,d;
for(int i=0; i<m; i++)
{
scanf(" %c %c",&c,&d);
s[c-'a'][d-'a']=1; ///能转换 标记为1
}
for(int k=0; k<m; k++)
for(int i=0; i<m; i++)
for(int j=0; j<m; j++)
if(s[i][k]==1&&s[k][j]==1) ///经过转换可以做到变换的也加1
s[i][j]=1;
int flag=1;
for(int i=0; i<n; i++)
{
if(a[i]!=b[i]&&s[a[i]-'a'][b[i]-'a']!=1) ///a[i]!=b[i] 剪枝!~
{
flag=0; ///判断有不符合 就直接跳出
break;
}
}
if(flag)printf("YES\n");
else printf("NO\n");
return 0;
}