hdu----(4545)魔法串(LCS)

魔法串

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

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

2013金山西山居创意游戏程序挑战赛——初赛(1)

简单题:

代码:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<string.h>
 4 char xm[1002],xx[1002];
 5 struct chage{
 6   char aa,bb;
 7 };
 8 chage mm[102];
 9 int mat[1002][1002];
10 int max(int a,int b){
11     return a>b?a:b;
12 }
13 int main()
14 {
15    int tes,n,i,j,k,cas=1;
16   // freopen("test.in","r",stdin);
17    scanf("%d",&tes);
18    while(tes--){
19       scanf("%s%s",xm,xx);
20       getchar();
21       scanf("%d",&n);
22         getchar();
23       for(i=0;i<n;i++){
24           scanf("%c %c",&mm[i].aa,&mm[i].bb);
25           getchar();
26       }
27       int lenxm=strlen(xm);
28       int lenxx=strlen(xx);
29       for(i=0;i<lenxm;i++)mat[i][0]=0;
30       for(j=0;j<lenxx;j++)mat[0][j]=0;
31       for(i=0;i<lenxm;i++){
32           for(j=0;j<lenxx;j++){
33             if(xm[i]==xx[j])
34                 mat[i+1][j+1]=mat[i][j]+1;
35             else{
36                 for(k=0;k<n;k++){
37                   if(mm[k].aa==xx[j]&&xm[i]==mm[k].bb){
38                       mat[i+1][j+1]=mat[i][j]+1;
39                       break;
40                    }
41                 }
42                 if(k==n) mat[i+1][j+1]=max(mat[i+1][j],mat[i][j+1]);
43             }
44         }
45       }
46       if(mat[lenxm][lenxx]==lenxm)
47         printf("Case #%d: happy\n",cas++);
48       else
49         printf("Case #%d: unhappy\n",cas++);
50     }
51
52  return 0;
53 }

时间: 2024-10-12 16:39:20

hdu----(4545)魔法串(LCS)的相关文章

HDU - 4545魔法串最长公共子序列

HDU - 4545 魔法串 Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Status Description 小明和他的好朋友小西在玩一个新的游戏,由小西给出一个由小写字母构成的字符串,小明给出另一个比小西更长的字符串,也由小写字母组成,如果能通过魔法转换使小明的串和小西的变成同一个,那么他们两个人都会很开心.这里魔法指的是小明的串可以任意删掉某个字符,或者把某些字符对照字

hdu 4545 魔法串

http://acm.hdu.edu.cn/showproblem.php?pid=4545 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn 2000 5 using namespace std; 6 7 char s1[maxn],s2[maxn]; 8 int t,m; 9 int dp[maxn][maxn]; 10 int g[maxn][maxn];

HDU 4545

魔法串 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1442    Accepted Submission(s): 541 Problem Description 小明和他的好朋友小西在玩一个新的游戏,由小西给出一个由小写字母构成的字符串,小明给出另一个比小西更长的字符串,也由小写字母组成,如果能通过魔法转换使小明的串和小西的变成同一

HDU 4545-魔法串-字符串

魔法串 问题描述 : 小明和他的好朋友小西在玩一个新的游戏,由小西给出一个由小写字母构成的字符串,小明给出另一个比小西更长的字符串,也由小写字母组成,如果能通过魔法转换使小明的串和小西的变成同一个,那么他们两个人都会很开心.这里魔法指的是小明的串可以任意删掉某个字符,或者把某些字符对照字符变化表变化. 如: 小西的串是 abba; 小明的串是 addba; 字符变化表 d b (表示d能转换成b). 那么小明可以通过删掉第一个d,然后将第二个d转换成b将串变成abba. 现在请你帮忙判断:他们能

HDU 2203 亲和串

题解:将原来的串扩展为两倍,然后用KMP匹配. #include <cstdio> #include <cstring> char str[200005],pat[100005]; int next[100005],N,M; void getnext(){ int i=1,j=0;next[1]=0; while(i<M){ if(j==0||pat[i]==pat[j])next[++i]=++j; else j=next[j]; } } int KMP(){ int i=

HDU 1513 Palindrome:LCS(最长公共子序列)or 记忆化搜索

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 题意: 给你一个字符串s,你可以在s中的任意位置添加任意字符,问你将s变成一个回文串最少需要添加字符的个数. 题解1(LCS): 很神奇的做法. 先求s和s的反串的LCS,也就是原串中已经满足回文性质的字符个数. 然后要变成回文串的话,只需要为剩下的每个落单的字符,相应地插入一个和它相同的字符即可. 所以答案是:s.size()-LCS(s,rev(s)) 另外,求LCS时只会用到lcs[i-

HDU 1503 Advanced Fruits(LCS变形且输出解)

http://acm.hdu.edu.cn/showproblem.php?pid=1503 题意: 给你两个字符串s1和s2, 要你输出它们的并串s. 其中s1是s的一个子序列且s2也是s的一个子序列且s是所有符合前面要求的最短字符串. 分析: 令dp[i][j]==x表示s1串的前i个字符和s2串的前j个字符组成的串的LCS长度为x. 我们先求出LCS的dp数组值. 然后按照POJ2250: http://blog.csdn.net/u013480600/article/details/40

hdu 2203 亲和串 kmp

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2203 思路: Problem Description 人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题Eddy也一直在思考,因为他在很小的时候就知道亲和串如何判断了,但是发现,现在长大了却不知道怎么去判断亲和串了,于是他只好又再一次来请教聪明且乐于助人的你来解决这个问题.亲和串的定义是这样的:给定两个字符串s1和s2,如果能通过s1循环移位,使s2包含在s1中

hdu 4545 贪心 *

题意:小明和他的好朋友小西在玩一个新的游戏,由小西给出一个由小写字母构成的字符串,小明给出另一个比小西更长的字符串,也由小写字母组成,如果能通过魔法转 换使小明的串和小西的变成同一个,那么他们两个人都会很开心.这里魔法指的是小明的串可以任意删掉某个字符,或者把某些字符对照字符变化表变化.如: 小西的串是 abba; 小明的串是 addba; 字符变化表 d b (表示d能转换成b). 那么小明可以通过删掉第一个d,然后将第二个d转换成b将串变成abba. 现在请你帮忙判断:他们能不能通过魔法转换