BZOJ4956: [Wf2017]Secret Chamber at Mount Rushmore
【传送门:BZOJ4956】
简要题意:
给出n对字母转换,m对单词
每对字母输入字母a和字母b,说明字母a可以转换为字母b(单向转换)
判断每对单词中第二个单词是否能够通过转换变成第一个单词
题解:
水题
因为只能是一个字母与一个字母间的转换,所以两个不同长度的单词肯定不能转换成功
而且一定是对应位置的转换
直接上floyd处理f数组,f[i][j]表示第i个字母是否能直接或间接转换为第j个字母
然后按位判断就好了
参考代码:
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> using namespace std; bool f[27][27]; char s1[51],s2[51]; int main() { int n,m; scanf("%d%d",&n,&m); memset(f,false,sizeof(f)); for(int i=1;i<=n;i++) { scanf("%s%s",s1+1,s2+1); f[s1[1]-'a'+1][s2[1]-'a'+1]=true; } for(int i=1;i<=26;i++) f[i][i]=true; for(int k=1;k<=26;k++) { for(int i=1;i<=26;i++) { if(i!=k) { for(int j=1;j<=26;j++) { if(i!=j&&j!=k) { if(f[i][k]&f[k][j]==true) { f[i][j]=true; } } } } } } for(int i=1;i<=m;i++) { scanf("%s%s",s1+1,s2+1); int len1=strlen(s1+1),len2=strlen(s2+1); if(len1!=len2) { printf("no\n"); continue; } bool bk=true; for(int j=1;j<=len1;j++) { if(f[s1[j]-'a'+1][s2[j]-'a'+1]==false) { bk=false; break; } } if(bk==false) printf("no\n"); else printf("yes\n"); } return 0; }
渺渺时空,茫茫人海,与君相遇,幸甚幸甚