Problem Description
小明和他的好朋友小西在玩一个新的游戏,由小西给出一个由小写字母构成的字符串,小明给出另一个比小西更长的字符串,也由小写字母组成,如果能通过魔法转换使小明的串和小西的变成同一个,那么他们两个人都会很开心。这里魔法指的是小明的串可以任意删掉某个字符,或者把某些字符对照字符变化表变化。如:
小西的串是 abba;
小明的串是 addba;
字符变化表 d b (表示d能转换成b)。
那么小明可以通过删掉第一个d,然后将第二个d转换成b将串变成abba。
现在请你帮忙判断:他们能不能通过魔法转换使两个人的串变成一样呢?
小西的串是 abba;
小明的串是 addba;
字符变化表 d b (表示d能转换成b)。
那么小明可以通过删掉第一个d,然后将第二个d转换成b将串变成abba。
现在请你帮忙判断:他们能不能通过魔法转换使两个人的串变成一样呢?
Input
首先输入T,表示总共有T组测试数据(T <= 40)。
接下来共T组数据,每组数据第一行输入小西的字符串,第二行输入小明的字符串(数据保证字符串长度不超过1000,小明的串的长度大于等于小西的,且所有字符均为小写字母)。接着输入字母表,先输入m,表示有m个字符变换方式(m< = 100),接着m行每行输入两个小写字母,表示前一个可以变为后一个(但并不代表后一个能变成前一个)。
接下来共T组数据,每组数据第一行输入小西的字符串,第二行输入小明的字符串(数据保证字符串长度不超过1000,小明的串的长度大于等于小西的,且所有字符均为小写字母)。接着输入字母表,先输入m,表示有m个字符变换方式(m< = 100),接着m行每行输入两个小写字母,表示前一个可以变为后一个(但并不代表后一个能变成前一个)。
Output
对于每组数据,先输出Case数。
如果可以通过魔法转换使两个人的串变成一样,输出“happy”,
否则输出“unhappy”。
每组数据占一行,具体输出格式参见样例。
如果可以通过魔法转换使两个人的串变成一样,输出“happy”,
否则输出“unhappy”。
每组数据占一行,具体输出格式参见样例。
Sample Input
2 abba addba 1 d b a dd 0
Sample Output
Case #1: happy Case #2: unhappy
解法一
#include <stdio.h> #include<map> #include<string.h> #include<algorithm> #include<iostream> using namespace std; int main() { int t,num=1; scanf("%d",&t); while(t--) { multimap<char,char>map;//不用map的原因是它不可以插入重复的,这也正是与multimap的区别 map.clear(); char str1[1100],str2[1100]; scanf("%s%s",str1,str2); int m; scanf("%d",&m); while(m--) { char a,b; getchar(); scanf("%c %c",&a,&b); map.insert(pair<char,char>(a,b));//把可以转换的字符插入 } int i,j; for(i=strlen(str1)-1; i>=0;) { for(j=strlen(str2)-1; j>=0; j--) { if(str1[i]==str2[j]) i--; else { multimap<char,char>::iterator it; //遍历 for(it=map.begin(); it!=map.end(); it++) if((*it).first==str2[j]&&(*it).second==str1[i])//可以转换 { i--; break; } } } if(i<0||j<0) break; } if(i<0) //i小于0则证明字符串str1中的字符,str2自身或者通过删去、转换都可以得到 printf("Case #%d: happy\n",num++); else printf("Case #%d: uhappy\n",num++); } return 0; }
解法二
#include<stdio.h> #include<string.h> int main() { int n,m,i,j,num=1; char a[1001],b[1001],c,d; scanf("%d",&n); while(n--) { int flag=0; int s[27][27]={0}; scanf("%s%s",a,b); scanf("%d",&m); for(i=0;i<m;i++) { getchar(); scanf("%c %c",&c,&d); s[c-'a'][d-'a']=1;//把可以转换的字符标记在数组中 } j=0; for(i=0;i<strlen(a);i++) { if(j==strlen(b))//字符串b已经完了,终止循环 break; if(a[i]==b[j]) { j++; continue; } while(a[i]!=b[j]) { if(j==strlen(b))//字符串b已经完了,而a没完,证明不可以 { flag=1; //不可以时标记flag为1 break; } else if(s[b[j]-'a'][a[i]-'a']==1)// 不相等时,找到可以转换的 { j++; break; } else j++; } } if(!flag) printf("Case #%d: happy\n",num++); else printf("Case #%d: uhappy\n",num++); } return 0; }