魔法串
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 2023 Accepted Submission(s): 753
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
Source
Recommend
思路:贪心,暴力。
开一个二维数组,把相应的英文字符映射成数字,如果某个字符可以转为另一个就a[i][j]置为1,代表可以转换,
然后循环a数组,在b数组中以贪心的策略,来对应a数组中的字符,就是如果相等或可以转换当前a数组中的这个字符就能被转换到。
最后判断所有a中的字符是否都能被转换到。(注意b数组中一个字符只能用一次,所以一遍循环就够了)
复杂度O(n)
1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<string.h> 5 #include<math.h> 6 #include<queue> 7 #include<string.h> 8 #include<stack> 9 #include<vector> 10 #include<map> 11 #define sc(x) scanf("%I64d",&x) 12 #define pr(x) printf("%I64d",x) 13 #define prr(x) printf("%I64d ",x) 14 #define prrr(x) printf(" %I64d",x) 15 #define FOR(i,p,q) for(int i=p;i<=q;i++) 16 using namespace std; 17 char a[2000]; 18 char b[2000]; 19 int aa[26][26]; 20 int main(void) 21 { 22 int n,i,j,k,p,q; 23 scanf("%d ",&k); 24 int s; 25 26 for(s=1; s<=k; s++) 27 { 28 memset(aa,0,sizeof(aa)); 29 scanf("%s",a); 30 scanf("%s",b); 31 int l=strlen(a); 32 int r=strlen(b); 33 int m; 34 scanf("%d",&m); 35 char nn,mm; 36 for(int yy=0; yy<m; yy++) 37 { 38 scanf(" %c %c",&nn,&mm); 39 int cc=nn-'a'; 40 int bb=mm-'a'; 41 aa[cc][bb]=1; 42 }//用数组映射标记 43 int ll,rr; 44 ll=0; 45 int flag=0; 46 for(i=0; i<l; i++) 47 { 48 for(j=ll; j<r; j++) 49 { 50 int ck=a[i]-'a'; 51 int cp=b[j]-'a'; 52 if(a[i]==b[j]||aa[cp][ck])//贪心策略, 53 { 54 break; 55 } 56 } 57 if(j==r)//a中当前字符无法匹配 58 { 59 flag=1; 60 } 61 ll=j+1; 62 } 63 printf("Case #%d: ",s); 64 if(flag) 65 { 66 printf("unhappy "); 67 } 68 else printf("happy "); 69 70 } 71 return 0; 72 }