魔法串
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 1347 Accepted Submission(s): 511
小西的串是 abba;
小明的串是 addba;
字符變化表 d b (表示d能轉換成b)。
那麼小明可以通過刪掉第一個d,然後將第二個d轉換成b將串變成abba。
現在請你幫忙判斷:他們能不能通過魔法轉換使兩個人的串變成一樣呢?
接下來共T組數據,每組數據第一行輸入小西的字符串,第二行輸入小明的字符串(數據保證字符串長度不超過1000,小明的串的長度大於等於小西的,且所有字符均爲小寫字母)。接着輸入字母表,先輸入m,表示有m個字符變換方式(m< = 100),接着m行每行輸入兩個小寫字母,表示前一個可以變爲後一個(但並不代表後一個能變成前一個)。
如果可以通過魔法轉換使兩個人的串變成一樣,輸出“happy”,
否則輸出“unhappy”。
每組數據佔一行,具體輸出格式參見樣例。
非動態規劃思想:
#include<string.h>
#include<stdio.h>
int map[26][26];
char a[1005],b[1005],c,d;
int main()
{
int n,m,i,la,lb,j,s=1;
scanf("%d",&n);
while(n--)
{
memset(map,0,sizeof(map));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(i=0;i<26;i++)map[i][i]=1;
scanf("%s%s",a,b);
la=strlen(a);
lb=strlen(b);
scanf("%d%*c",&m);
for(i=1;i<=m;i++)
{
scanf("%c %c%*c",&c,&d);
map[c-'a'][d-'a']=1;
}
for(j=i=0;i<la;)
{
if(map[b[j]-'a'][a[i]-'a'])
{j++;i++;}
else {
while(!map[b[j]-'a'][a[i]-'a']&&j<lb)
j++;
if(j==lb)break;
}
}
if(i==la)printf("Case #%d: happy\n",s++);
else printf("Case #%d: unhappy\n",s++);
}
return 0;
}