ACM训练合集---HDU4545 魔法串
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)
解题思路
本题实际上是要找 母串中的字符在相对位置不变的情况下,是否可以经过组合(删除或转变)形成目标子串。
什么叫相对位置?比如母串为adc
,d
要始终在a
的后面,c
始终要在最后一个位置,这就叫相对位置。
因为字符串不长,所以时我们可以使用暴力匹配方式来解决。大致解题流程如下:
实现代码:
#include<iostream>
#include<cstring>
#include<map>using namespace std;bool magicstr(char s1[], char s2[], multimap<char, char> r){int i,j;// index:记录小明字符串的下标// num:记录两个字符串匹配成功的字符数int index = 0, num = 0;int len1 = strlen(s1);int len2 = strlen(s2);for (i = 0; i < len1; i++){// 标记位,判断通过规则转换是否可以匹配成功bool flag = false;for (j = index; j < len2; j++){if (s1[i] == s2[j]){index = j+1; num++;break;}else{if (r.size() != 0){multimap<char, char>::iterator it;for (it = r.begin(); it != r.end(); it++){if (it->first == s2[j] && it->second == s1[i]){index = j+1; num++;flag = true;break; //跳出规则转换的for循环}}}if (flag) break; //跳出遍历小明字符串的for循环}}}// 匹配成功的字符串跟小西字符串长度一样的话就trueif (num == len1) return true;return false;
}int main(){char s1[1001], s2[1001]; //接收输入的字符串int t;int i, j, m;char c1, c2; // 接收规则中的那两个字符cin >> t;for (i = 0; i < t; i++){// 存放规则的mapmultimap<char, char> rule;scanf("%s%s", s1, s2);cin >> m;for (j = 0; j < m; j++){cin >> c1 >> c2;// 将每个规则放在map中rule.insert(pair<char, char>(c1, c2));}if (magicstr(s1, s2, rule)){cout << "Case #"<< i+1 <<": happy" << endl;}else{cout << "Case #" << i+1 << ": unhappy" << endl;}}return 0;
}
程序详情流程图如下:
这是个人的做题的一些想法及代码实现。已AC,如果小伙伴有更好的思路可以在评论区分享。
学无止境,加油!
ACM训练合集---HDU4545 魔法串相关推荐
- 敲重点!最全大模型训练合集!
01 大模型训练总体架构 如何利用计算中心成千上百的AI加速芯片的集群,训练参数量超过百亿的大规模模型?并行计算是一种行之有效的方法,除了分布式并行计算相关的技术之外,其实在训练大模型的过程还会融 ...
- 『ACM』ACM模板合集
写在前面: 第一年小白拿铜牌,第二年队友出走,加上疫情原因不能回校训练导致心底防线彻底崩盘,于是选择退役. 自从退役之后,一直想我打了那么久的ACM,什么也没留下觉得很难受,突然想到我打ACM的时候, ...
- 蓝桥杯算法训练合集一 1.印章2.拿金币3.数字游戏4.无聊的逗5.礼物
目录 1.印章(动态规划) 2.拿金币(动态规划) 3.数字游戏(搜索) 4.无聊的逗(状态搜索) 5.礼物(二分法和前缀和) 1.印章(动态规划) 问题描述 共有n种图案的印章,每种图案的出现概率相 ...
- 蓝桥杯算法训练合集十三 1.P06022.P07033.逗志芃的危机4.唯一的小可爱5.JOE的矩阵
目录 1.P0602 2.P0703 3.逗志芃的危机 4.唯一的傻子 5.JOE的矩阵 1.P0602 问题描述 编写一个程序,输入一个4位的自然数,将组成该数的各位数字重新排列,形成一个最大数和一 ...
- 蓝桥杯算法训练合集三 1.车的位置2.24点3.最大分解4.RP大冒险5.士兵杀敌(二)
目录 1.车的位置(搜索) 2.24点(搜索) 3.最大分解(贪心) 4.RP大冒险 5.士兵杀敌(二) 1.车的位置(搜索) 问题描述 在一个n*n的棋盘中,每个格子中至多放置一个车,且要保证任何两 ...
- PAT甲级训练合集(1-70)
本章题解跳转 考点 P1001 数字的数组表示和处理 P1002 多项式的数组表示和处理 P1003 深度优先搜素 P1004 深度优先搜素 P1005 哈希表 P1006 P1007 数组子区间求和 ...
- 蓝桥杯算法训练合集四 1.p0802 2.A的B的C次方次方 3.出现次数最多的整数 4.成绩分级 5.台阶问题
目录 1.p0802 2.A的B的C次方次方 3.出现次数最多的整数 4.成绩分级 5.台阶问题 1.p0802 问题描述 编写一个字符串表达式求解函数int expression(char* s); ...
- 蓝桥杯算法训练合集十二 1.比较2.计算最小公倍数3.比赛安排4.潜伏者5.P0702
目录 1.比较 2.计算最小公倍数 3.比赛安排 4.潜伏者 5.P0702 1.比较 问题描述 给出一个n长的数列,再进行m次询问,每次询问询问两个区间[L1,R1],[L2,R2], 询问数列第L ...
- 蓝桥杯算法训练合集十七 1.数字反转2.试题39713.矮人采金子4.筛法5.机器指令
目录 1.数字反转 2.试题3971 3.矮人采金子 4.筛法 5.机器指令 1.数字反转 问题描述 给定一个整数,请将该数各个位上数字反转得到一个新数.新数也应满足整数的常见形式,即除非给定的原数为 ...
最新文章
- 微软张若非:搜索引擎和广告系统,那些你所不知的AI落地技术
- UVA 610 Street Directions 双连通分量
- [Nikon D80]Beauty
- tensorflow使用tf.placeholder会报错
- [C#.NET 拾遗补漏]16:几个常见的TAP异步操作
- spring的bean范围_Spring Bean范围
- 50 days before NOI2017
- matlab已知ft求f2t,基于Matlab的信号与系统实验指导2
- C# Monitor实现
- .NET Framework-多线程网络编程
- 数据结构时间复杂度_数据结构之时间复杂度分析
- libgmailer更新了,俺的下载空间又可以使用了(使用G-Share)
- wdcp安装多种php版本共存
- C++ Windows键盘钩子
- JEECG框架的dictSelect下拉
- 日志易:IT 运维分析及海量日志搜索的实践之路(上)
- Matlab中mapminmax函数使用注意事项
- 1995-2013年RSA大会历届主题回顾
- 探秘 Containerd 容器中的 Shim 进程
- java毕业设计校园闲置物品租售系统mybatis+源码+调试部署+系统+数据库+lw