hdu4545魔法串

魔法串

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 1347    Accepted Submission(s): 511

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
 
Source

 

非動態規劃思想:

#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;
}
發佈了145 篇原創文章 · 獲贊 27 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章