zoukankan      html  css  js  c++  java
  • HDU 4545 魔法串

    魔法串

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

    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
     
    Recommend
    liuyiding
      解题思路:直接贪心即可,记下b串中每个字母可变的字母,在a串中只要能找到b串中某个字母及其可变字母能与之匹配就匹配,这样做的理由是只能在b串中删除字母,也就是必须要保证b串中对应a串的匹配字母在a串中是依次递增的,因此,匹配到最后,只要a串中字母全部得以匹配,就是happy,否则unhappy.
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<vector>
    using namespace std;
    int main()
    {
    	int i,j,k,t,l1,l2,m,p,q;
    	char s1[1001],s2[1001],t1[2],t2[2];
    	bool visit[1001],flag;
    	scanf("%d",&t);
    	getchar();
    	vector<char> s[26];
    	for(p=1;p<=t;p++)
    	{
    		q=0;
    		for(i=0;i<26;i++)
    			s[i].clear();
    		memset(s1,'\0',sizeof(s1));
    		memset(s2,'\0',sizeof(s2));
    		memset(visit,false,sizeof(visit));
    		scanf("%s%s",s1,s2);
    		l1=strlen(s1);l2=strlen(s2);
    		s1[l1]='\0';s2[l2]='\0';
    		scanf("%d",&m);
    		for(i=0;i<l1;i++)
    			s[s1[i]-'a'].push_back(s1[i]);
    		while(m--)
    		{
    			scanf("%s%s",t1,t2);
    			k=s[t1[0]-'a'].size();
    			s[t1[0]-'a'].push_back(t2[0]);
    		}
    		for(i=0;i<l1;i++)
    		{
    			flag=false;
    			for(j=q;j<l2;j++)
    			{
    				if(!visit[j])
    				{
    				    for(k=0;k<s[s2[j]-'a'].size();k++)
    					    if(s[s2[j]-'a'][k]==s1[i])
    					    {
    							visit[j]=true;
    							flag=true;
    							q=j;
    							break;
    					    }
    				}
    				if(flag)
    					break;
    			}
    			if(!flag)
    				break;
    		}
    		printf("Case #%d: ",p);
    		if(flag)
    			printf("happy\n");
    		else
    			printf("unhappy\n");
    	}
    	return 0;
    }


  • 相关阅读:
    hdu 6702 ^&^ 位运算
    hdu 6709 Fishing Master 贪心
    hdu 6704 K-th occurrence 二分 ST表 后缀数组 主席树
    hdu 1423 Greatest Common Increasing Subsequence 最长公共上升子序列 LCIS
    hdu 5909 Tree Cutting FWT
    luogu P1588 丢失的牛 宽搜
    luogu P1003 铺地毯
    luogu P1104 生日
    luogu P1094 纪念品分组
    luogu P1093 奖学金
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3085856.html
Copyright © 2011-2022 走看看