HDU 4545 - 마법 꼬치
3447 단어 ACM - 사유 문제
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 3030 Accepted Submission(s): 1099
제목 링크: 클릭 하여 링크 열기
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
分析:
本题就是字符串处理问题,但是我们得考虑一个问题就是,题中说的是可以删去小明的字符串中的任意字符,也能对照字母表将其转换,那么如果在两个串比较的过程中,遇见不相等的串的话,你是选择删去还是选择先对照字母表呢?答案是后者,我们应该先对照字母表,查找是否有可以转换成功的字符存在,如果存在,就将其转换,否则得话,再删去,因为如果一味的删去,最后会让小明的字符串变短,不利于后续的比较。
然后就是你选择什么存储方式来存字符表呢?我一看就毫不犹豫的选择了 map ,结果 wa 一脸,我滴天。。查错半天半,最后队友的一句话点醒了我,就是一个字母有可能可以转换成多个字母,于是我又改为二维数组的存储方式,s[i][j] ,对于每组测试数据,先将 s 刷为 0 ,如果我们要存 d b 的话,就将 s[d-'a'][b-'a']=1; 这样存比较省内存,一共 26 个字母,我们就可以开30*30的维数。好啦,看看代码吧!
#include
#include
#include
#include
#include
using namespace std;
int main()
{
int s[30][30];
char p[1005],q[1005];
int t,m;
char a,b;
int num=0;
scanf("%d",&t);
while(t--)
{
memset(s,0,sizeof(s));/// s 0
scanf("%s",p);
scanf("%s",q);
scanf("%d",&m);
while(m--)
{
getchar();/// ,
scanf("%c %c",&a,&b);
s[a-'a'][b-'a']=1;
}
int i=0;/// p
int bj=0;
for(int j=0;j