17号西山居初赛最简单的题~
给一个替换规则问能不能从第二个串中通过替换找到第一个串~比赛时候因为研究有没有可能 a->b->c而WA了好几次-_-###
源代码:
#include<myhead>
const int N=26;
const int M=1011;
string a,b;
int da[M],db[M];
bool Hash[M];
bool make[N][N];
int cy[M];
void init() {
memset(make,false,sizeof(make));
memset(cy,-1,sizeof(cy));
cin>>a>>b;
for(int i=0;i<a.size();++i) {
da[i]=a[i]-'a';
}
for(int j=0;j<b.size();++j) {
db[j]=b[j]-'a';
}
int n;
cin>>n;
string ta,tb;
for(int i=0;i<N;++i) {
make[i][i]=true;
}
for(int i=0;i<n;++i) {
cin>>ta>>tb;
make[ta[0]-'a'][tb[0]-'a']=true;
}
}
/*
void floyed() {
for(int k=0;k<N;++k) {
for(int i=0;i<N;++i) {
for(int j=0;j<N;++j) {
make[i][j]=make[i][j]||(make[i][k]&&make[k][j]);
}
}
}
}*/
bool dfs(int x,int y) {
if(x==a.size())
return true;
if(y==b.size())
return false;
if(make[db[y]][da[x]]) {
return dfs(x+1,y+1);
} else {
return dfs(x,y+1);
}
}
int main() {
int t;
cin>>t;
int m=1;
while(t--) {
init();
//floyed();
cout<<"Case #"<<m<<": ";
if(dfs(0,0)) {
cout<<"happy"<<endl;
} else {
cout<<"unhappy"<<endl;
}
m++;
}
return 0;
}