Same String---相同的字符串

92 阅读2分钟

​本文已参与「新人创作礼」活动,一起开启掘金创作之路。​

单点时限: 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;
}