1 条题解
-
0
题意解析
模式定义:模式由单词和占位符组成,占位符是用尖括号括起来的单词。例如 就是一个占位符,普通单词如 “to” “be” 等。匹配规则:短语与模式匹配需满足每个占位符能被系统地替换为单词,使模式和短语一致,即相同占位符替换为相同单词。如 “to be or not to be” 能匹配 be not 。任务要求:给定两个模式,要找出一个能同时匹配这两个模式的短语,若不存在则输出 “-”。输入中第一行是测试用例数 n,每个测试用例包含两行模式。模式由小写单词和小写占位符构成,长度不超 字符,单词最多 字符,相邻元素用空格分隔。
解题思路
解析模式:将输入的两个模式按单词和占位符进行拆分,记录每个占位符的位置及对应的模式。 尝试匹配:遍历所有可能的单词组合,对两个模式中的占位符进行替换尝试。 检查匹配结果: 若找到一种单词替换方式,使两个模式都能转换为相同短语,则该短语即为所求。 若遍历完所有合理组合都未找到匹配短语,则输出 “-”。 优化方向:为提高效率,可利用哈希表记录已尝试过的占位符 - 单词映射关系,避免重复尝试;同时,可根据模式中单词和占位符的分布特点,优先尝试可能性较大的单词组合。
#include <stdio.h> #include <iostream> #include <sstream> #include <algorithm> #include <map> using namespace std; int main() { int testcase; string A, B; string ta[105], tb[105]; scanf("%d", &testcase); while(getchar() != '\n'); while(testcase--) { getline(cin, A); getline(cin, B); stringstream sina(A), sinb(B); int na = 0, nb = 0; while(sina >> ta[na]) na++; while(sinb >> tb[nb]) nb++; if(na != nb) { puts("-"); continue; } map<string, string> ma, mb; int error = 0, i; int fa, fb; bool update = false; do { update = false; for(i = 0; i < na; i++) { fa = 0, fb = 0; if(ta[i][0] == '<' && ta[i][ta[i].length()-1] == '>') { if(ma.find(ta[i]) != ma.end()) ta[i] = ma[ta[i]], update = true, fa = 1; else fa = 0; } else fa = 1; if(tb[i][0] == '<' && tb[i][tb[i].length()-1] == '>') { if(mb.find(tb[i]) != mb.end()) tb[i] = mb[tb[i]], update = true, fb = 1; else fb = 0; } else fb = 1; if(fa == 0 && fb == 1) ma[ta[i]] = tb[i], ta[i] = tb[i], fa = 1; if(fa == 1 && fb == 0) mb[tb[i]] = ta[i], tb[i] = ta[i], fb = 1; if(fa == 1 && fb == 1) { if(ta[i] != tb[i]) error = 1; } } } while(update && !error); for(i = 0; i < na; i++) { fa = 0, fb = 0; if(ta[i][0] == '<' && ta[i][ta[i].length()-1] == '>') fa = 0; else fa = 1; if(tb[i][0] == '<' && tb[i][tb[i].length()-1] == '>') fb = 0; else fb = 1; if(fa == 0) ta[i] = "foo"; if(fb == 0) tb[i] = "foo"; } if(error) { puts("-"); continue; } for(i = 0; i < na; i++) { if(i) cout << " "; cout << ta[i]; } cout << endl; } return 0; }
- 1
信息
- ID
- 867
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 0
- 上传者