睿抗2023 题2

最复杂的一道字符串

字典的迭代器

substr的应用

思路(抄):

用哈希表存储已知的每个字符串的等级。

对于需要判断的字符串s:

首先判断是否已知, 若为真直接输出即可
枚举每个已知等级的字符串, 判断其是否为s的前缀,若为前缀则判断s除去这部分前缀后的部分是否已知等级, 若都已知, 则拼接
此过程中记录拼接的次数, 若不为一则定为D级。
时间复杂度O ( N M ) O(NM)O(NM)

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int m, n, i = 0;
    cin >> m >> n;
    string a, b, s, res;
    map<string, string> level;
    for (i; i < m; i++)
    {
        cin >> a >> b;
        level[a] = b;
    }
    for (i = 0; i < n; i++)
    {
        cin >> s;
        if (level.count(s))
            cout << level[s] << endl;
        else
        {
            int cnt = 0;
            for (auto &p : level)
            {
                if (p.first.size() < s.size() && s.substr(0, p.first.size()) == p.first && level.count(s.substr(p.first.size())))
                {
                    cnt++;
                    cout << level[s.substr(0, p.first.size())] << level[s.substr(p.first.size())] << endl;
                    // res = level[s.substr(0, p.first.size())] + level[s.substr(p.first.size())];
                }
            }
            if (cnt != 1)
            {
                cout << "D" << endl;
            }
        }
    }
    return 0;
}
改:
            for (auto &p : level)
            {
                if (p.first.size() < s.size() && s.substr(0, p.first.size()) == p.first && level.count(s.substr(p.first.size())))
                {
                    cnt++;
                    res=level[s.substr(0, p.first.size())] + level[s.substr(p.first.size())];
                }
            }
            if (cnt != 1)
            {
                res="D";
            }cout<<res<<endl;
        }
    }
    return 0;
}
结果单独存储避免重复输出

发表评论