ttt:客户端将提供一个最优匹配结果数k,一个待匹配字符串,和若干个命令。希望你能实现一个算法,它实现两种操作:
A: 增加一项搜索记录
P: 打印当前的k个最优匹配结果
我们规定每个匹配记录(record)需满足:record中存在至少一个与s完全匹配的子串。
并规定,若满足下列条件,则称record a是比record b更好的匹配记录
1.record a长度短于record b
2.长度相同,record a的字典序小于record b
输入数据包含n + 3行每一组数据由三行组成第一行:n第二行:k第三行:s第四行~n+3行:[A record] 或 [P]n: 需执行的总命令数 (n < 10000)k:需要输出的总匹配记录数目(0 <k <= n)s:待匹配字符串 (0 < length < 100)A record: 增加一项record, 记录和A由空格分隔P: 打印当前的k个最优匹配结果
输入数据保证每条字符串长度 (0 < length < 100),且仅由小写ANSI字符组成
每次P命令执行后,输出P:k行数据(不允许有重复数据,相同的看做同一条数据)。不足k行则输出所有符合题干条件的记录。输出顺序需按提干条件由优先级高->低顺序排列
6 3 wps A ttt.smart A lhy.stupid.wps P A lhy.stupid.wps A wps.cn P
P: lhy.stupid.wps P: wps.cn lhy.stupid.wps
4 1 ttt P A tttnba A ttttql P
P: P: tttnba
保证所有查询的输出结果加在一起字符总长度不超过5×106
#include <iostream> #include <string> #include <regex> #include <set> using namespace std; struct cmp{ bool operator()(const string& a,const string& b) const { return a.size() != b.size() ? a.size() < b.size() : a < b; } }; int main() { int n, k; string str,record; char type; set<string, cmp> match; cin >> n >> k >> str; for (int i = 0; i < n; i++) { cin >> type; if (type == 'A') { cin >> record; if(regex_search(record, regex(str))) match.insert(record); } else { cout << "P:" << endl; int output = 0; for (const string& s : match) { cout << s << endl; if (++output==k) break; } } } return 0; }