题目传送门:在此
先对每个字符串进行预处理。使用哈希表 m ,键表示子串,值表示子串出现次数以及出现该子串的字符串。用 set 去重,如果子串在同一字符串中出现多次,第一次我们就已经做好相关的工作,那就不需要再管它了。后面查询子串时,只需询问哈希表即可。
#include <iostream>
#include <unordered_map>
#include <unordered_set>
using namespace std;
int main(void) {
unordered_map<string, pair<int, string>> m;
unordered_set<string> in;
int p, q;
cin >> p;
string s;
for (int i = 0; i < p; ++i) {
cin >> s;
for (int j = 0; j < s.size(); ++j) {
for (int k = j + 1; k <= s.size(); ++k) {
string t(s.begin() + j, s.begin() + k);
if (in.find(t) == in.end()) {
in.insert(t);
m[t].first++;
m[t].second = s;
}
}
}
in.clear();
}
cin >> q;
for (int i = 0; i < q; ++i) {
cin >> s;
if (m.find(s) != m.end()) {
cout << m[s].first << " " << m[s].second << endl;
} else {
cout << "0 -" << endl;
}
}
return 0;
}