noip模拟赛 fateice-string
题目背景
Aldnoah
——火星上超古代文明留下的能量源,承认初代火星移民雷伊·雷加利亚博士(即后来的薇瑟帝国初代皇帝)为正统继承者,启动因子融入皇族的遗传因子中,只有皇族天生具有Aldnoah的启动能力。可以把Aldnoah看成是有认主能力的特殊矿产。在火星骑士的扬陆城中,安置有Aldnoah的启动装置。
题目描述
两天前,被授予启动能力的斯雷因·特洛耶特伯爵准备对启动装置进行加密,以防有人趁其不备破坏装置。
他将这个任务交给了他的心腹哈库莱特。忠实的哈库莱特认为,只需要输入密码就能解锁的加密装置实在是太不安全了,所以他决定用一个特别的加密装置来对Aldnoah启动装置进行保护。
他精心设计了这样一套加密装置:
该装置会给定解密者两个字符串s,t,其中s只包含小写字母以及*,t只包含小写字母。解密者可以进行任意多次操作,每次选择s中的一个*,将它修改为任意多个(可以是0个)它的前一个字符。询问是否能将s修改为t。
聪明的哈库莱特当然不会只给予解密者一组数据啦,所以解密时会有多组数据出现,并且每组数据只有在规定时间内答对才能够继续解密下一组数据。
今天他制作好了加密装置交给了斯雷因·特洛耶特伯爵,斯雷因准备先进行测试过后再将它安装在启动装置上。他随机制造了几组测试数据输入装置,然后让哈库莱特进行解密。哈库莱特会怎么做呢?
输入输出格式
输入格式:
第一行一个整数T表示数据组数。
每组数据两行,第一行一个字符串s,第二行一个字符串t。
输出格式:
每组数据输出一行,如果能将s修改为t,输出Yes,否则输出No。
输入输出样例
2 a* aaaa a* ab
Yes No
说明
对于20%的数据,|s|,|t|<=7。
对于60%的数据,|s|,|t|<=300。
对于100%的数据,T<=100,|s|,|t|<=30000。
分析:这道题能拿多少分在于你枚举什么.如果你枚举每个*赋值多少个字母,那么就有20分,如果你枚举两个串,那么就有60分,如果你枚举一个串,看看另外一个串是否符合要求就是满分.
因为每个*只对同一字母有影响,所以把每一段字母相同的连同*分成一段,如果第二个字符串第i段有x个字母,那么第一个字符串中第i段也应该有x个字母,如果里面有*号那么可以少于x个字母,否则就必须等于x个字母,否则匹配不成功,扫一遍就可以了.
多组数据一定要初始化!本来A掉的结果忘了初始化爆0了QAQ.
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int T; char s1[30010], s2[30010]; int len1, len2, cur, num; bool flag = false; bool pipei(int x, char biaozhun) { int res = 0; bool can = false; while (s1[cur] != biaozhun && cur <= len1) { if (cur > len1) return false; if (s1[cur] == '*') can = 1; else res++; cur++; } if (res < x && can) return true; if (res < x && !can) return false; if (res == x) return true; if (res > x) return false; } int main() { scanf("%d", &T); while (T--) { num = 0; flag = 0; memset(s1, 0, sizeof(s1)); memset(s2, 0, sizeof(s2)); scanf("%s", s1 + 1); scanf("%s", s2 + 1); len1 = strlen(s1 + 1); cur = 1; len2 = strlen(s2 + 1); while (s1[cur] == '*' && cur <= len1) cur++; if (cur > len1) { printf("No\n"); continue; } if (s1[cur] != s2[1]) { printf("No\n"); continue; } for (int i = 1; i <= len2; i++) { num++; if (s2[i] != s2[i + 1]) { if (!pipei(num, s2[i + 1])) { flag = 1; break; } num = 0; } } if (flag) printf("No\n"); else printf("Yes\n"); } return 0; }