字符串游戏

xiaoxiao2021-02-28  44

Problem Description   小明和他的好朋友小西在玩一个新的游戏,由小西给出一个由小写字母构成的字符串,小明给出另一个比小西更长的字符串,也由小写字母组成,如果能通过魔法转换使小明的串和小西的变成同一个,那么他们两个人都会很开心。这里魔法指的是小明的串可以任意删掉某个字符,或者把某些字符对照字符变化表变化。如:     小西的串是 abba;     小明的串是 addba;     字符变化表 d b (表示d能转换成b)。   那么小明可以通过删掉第一个d,然后将第二个d转换成b将串变成abba。   现在请你帮忙判断:他们能不能通过魔法转换使两个人的串变成一样呢?   Input   首先输入T,表示总共有T组测试数据(T <= 40)。   接下来共T组数据,每组数据第一行输入小西的字符串,第二行输入小明的字符串(数据保证字符串长度不超过1000,小明的串的长度大于等于小西的,且所有字符均为小写字母)。接着输入字母表,先输入m,表示有m个字符变换方式(m< = 100),接着m行每行输入两个小写字母,表示前一个可以变为后一个(但并不代表后一个能变成前一个)。   Output   对于每组数据,先输出Case数。   如果可以通过魔法转换使两个人的串变成一样,输出“happy”,   否则输出“unhappy”。   每组数据占一行,具体输出格式参见样例。   Sample Input 2 abba addba 1 d b a dd 0   Sample Output Case #1: happy Case #2: unhappy #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int a[30][30]; char s1[1009],s2[1009]; int main() { int flage,g,i,h,l1,l2,k,t; char x,y; scanf("%d",&g); for(h=1;h<=g;h++) { memset(a,0,sizeof(a)); scanf("%s",s1); scanf("%s",s2); l1=strlen(s1); l2=strlen(s2); scanf("%d",&i); while(i--) { cin >>x>>y; a[x-'a'][y-'a']=1; } t=0; flage=0; for(k=0;k<l1;k++) { if(t==l2) break; if(s1[k]==s2[t]) { t++; continue; } while(s1[k]!=s2[t]) { if(t==l2) { flage=1; break; } if(a[s2[t]-'a'][s1[k]-'a']==1) { t++; break; } else t++; } } printf("Case #%d: ",h); if(flage!=1) printf("happy\n"); else printf("unhappy\n"); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-2621203.html

最新回复(0)