1 条题解

  • 0
    @ 2025-4-9 21:34:55

    题意解析

    模式定义:模式由单词和占位符组成,占位符是用尖括号括起来的单词。例如  就是一个占位符,普通单词如 “to” “be” 等。匹配规则:短语与模式匹配需满足每个占位符能被系统地替换为单词,使模式和短语一致,即相同占位符替换为相同单词。如 “to be or not to be” 能匹配  be not 。任务要求:给定两个模式,要找出一个能同时匹配这两个模式的短语,若不存在则输出 “-”。输入中第一行是测试用例数 n,每个测试用例包含两行模式。模式由小写单词和小写占位符构成,长度不超 100100 字符,单词最多 1616 字符,相邻元素用空格分隔。

    解题思路

    解析模式:将输入的两个模式按单词和占位符进行拆分,记录每个占位符的位置及对应的模式。 尝试匹配:遍历所有可能的单词组合,对两个模式中的占位符进行替换尝试。 检查匹配结果: 若找到一种单词替换方式,使两个模式都能转换为相同短语,则该短语即为所求。 若遍历完所有合理组合都未找到匹配短语,则输出 “-”。 优化方向:为提高效率,可利用哈希表记录已尝试过的占位符 - 单词映射关系,避免重复尝试;同时,可根据模式中单词和占位符的分布特点,优先尝试可能性较大的单词组合。

    #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
    上传者