HDU 4545魔法串
8210 ワード
魔法の串
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 427 Accepted Submission(s): 174
Problem Description
明ちゃんと彼の親友の西ちゃんは新しいゲームをしていて、西ちゃんから小文字で構成された文字列を与えて、明ちゃんは西ちゃんよりも長い文字列を与えて、小文字で構成されています.魔法の変換で明ちゃんの列と西ちゃんの列を同じにすることができれば、彼ら二人は喜んでいます.ここで魔法とは、明ちゃんの列が任意に文字を削除したり、文字の変化表に合わせて変化したりすることを意味します.次のようになります.
小西の串はabbaです.
明ちゃんの串はaddbaです.
文字変化テーブルd b(dがbに変換できることを示す).
では、明ちゃんは最初のdを削除して、2番目のdをbに変換してabbaにすることができます.
今、彼らは魔法の転換で二人の串を同じにすることができますか?
Input
まずTを入力し,T組のテストデータ(T<=40)が合計であることを示す.
次にT組のデータを共有し、各グループのデータの第1行は小西の文字列を入力し、第2行は小明の文字列を入力する(データは文字列の長さが1000を超えないことを保証し、小明の列の長さは小西のものより大きく、すべての文字は小字アルファベットである).次にアルファベット表を入力し、まずmを入力し、m文字変換方式(m<=100)を表し、次にm行は各行に2つの小文字を入力し、前が後になることを示す(ただし、後が前になることを意味しない).
Output
データのセットごとにCase数を出力します.
魔法変換で二人の串を同じにすることができれば、「happy」を出力し、
そうでない場合は「unhappy」を出力します.
各グループのデータは1行を占め、具体的な出力フォーマットはサンプルを参照してください.
Sample Input
2 abba addba 1 d b a dd 0
Sample Output
Case #1: happy Case #2: unhappy
Source
2013金山西山居クリエイティブゲームプログラム挑戦試合-初戦(1)
Recommend
liuyiding
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 427 Accepted Submission(s): 174
Problem Description
明ちゃんと彼の親友の西ちゃんは新しいゲームをしていて、西ちゃんから小文字で構成された文字列を与えて、明ちゃんは西ちゃんよりも長い文字列を与えて、小文字で構成されています.魔法の変換で明ちゃんの列と西ちゃんの列を同じにすることができれば、彼ら二人は喜んでいます.ここで魔法とは、明ちゃんの列が任意に文字を削除したり、文字の変化表に合わせて変化したりすることを意味します.次のようになります.
小西の串はabbaです.
明ちゃんの串はaddbaです.
文字変化テーブルd b(dがbに変換できることを示す).
では、明ちゃんは最初のdを削除して、2番目のdをbに変換してabbaにすることができます.
今、彼らは魔法の転換で二人の串を同じにすることができますか?
Input
まずTを入力し,T組のテストデータ(T<=40)が合計であることを示す.
次にT組のデータを共有し、各グループのデータの第1行は小西の文字列を入力し、第2行は小明の文字列を入力する(データは文字列の長さが1000を超えないことを保証し、小明の列の長さは小西のものより大きく、すべての文字は小字アルファベットである).次にアルファベット表を入力し、まずmを入力し、m文字変換方式(m<=100)を表し、次にm行は各行に2つの小文字を入力し、前が後になることを示す(ただし、後が前になることを意味しない).
Output
データのセットごとにCase数を出力します.
魔法変換で二人の串を同じにすることができれば、「happy」を出力し、
そうでない場合は「unhappy」を出力します.
各グループのデータは1行を占め、具体的な出力フォーマットはサンプルを参照してください.
Sample Input
2 abba addba 1 d b a dd 0
Sample Output
Case #1: happy Case #2: unhappy
Source
2013金山西山居クリエイティブゲームプログラム挑戦試合-初戦(1)
Recommend
liuyiding
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char str1[1010],str2[1010];
int hash[150][150];
int dp[1010][1010];
int main(){
//freopen("input.txt","r",stdin);
int t,cases=0;
scanf("%d",&t);
while(t--){
scanf("%s",str1+1);
scanf("%s",str2+1);
//printf("%s %s
",str1+1,str2+1);
int m;
scanf("%d",&m);
memset(hash,0,sizeof(hash));
char c1[5],c2[5];
while(m--){
scanf("%s%s",c1,c2);
hash[(int)c1[0]][(int)c2[0]]=1;
}
memset(dp,0,sizeof(dp));
int len1=strlen(str1+1);
int len2=strlen(str2+1);
for(int i=1;i<=len2;i++)
for(int j=1;j<=len1;j++){
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
if(str2[i]==str1[j] || hash[(int)str2[i]][(int)str1[j]])
dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1);
}
printf("-----------
");
for(int i=1;i<=len2;i++){
for(int j=1;j<=len1;j++)
printf("%d ",dp[i][j]);
printf("
");
}
printf("-----------
");
if(dp[len2][len1]==len1)
printf("Case #%d: happy
",++cases);
else
printf("Case #%d: unhappy
",++cases);
}
return 0;
}