4 条题解
-
1
解题思路
1. 先对字符串进行预处理,获取每中长度的串
2. 由于abc,cba..这种属于同一种串,那么分开处理将会十分浪费时间,使用sort进行排序,可将同一类型的串变成同一个串。随后进行计数即可
3. 子串进行匹配前,也使用sort进行排序,便可以从map中查询到对应串的出现次数
完整代码如下:
#include <iostream> #include <map> #include <vector> #include <cstring> #include <algorithm> using namespace std; int main() { int T; cin >> T; for (int i = 0; i < T; i++) { string main_sec; cin >> main_sec; int n = main_sec.size(); int Q; cin >> Q; // 预处理:预先计算所有可能长度的字符频率 // 使用一个映射,键为长度,值为另一个映射(键为排序后的子串,值为出现次数) map<int, map<string, int>> precomputed; // 只处理长度1到10的子串(根据题目提示,子串长度<=10) for (int len = 1; len <= 10; len++) { for (int start = 0; start <= n - len; start++) { string substr = main_sec.substr(start, len); // 对子串排序,作为频率的标识 sort(substr.begin(), substr.end()); precomputed[len][substr]++; } } for (int j = 0; j < Q; j++) { string str; cin >> str; int len = str.size(); // 如果长度超过10或主串长度,直接返回0 if (len > 10 || len > n) { cout << 0 << endl; continue; } // 对查询子串排序,作为频率标识 sort(str.begin(), str.end()); // 直接从预处理结果中获取计数 if (precomputed.find(len) != precomputed.end() && precomputed[len].find(str) != precomputed[len].end()) { cout << precomputed[len][str] << endl; } else { cout << 0 << endl; } } } return 0; }
信息
- ID
- 196
- 时间
- 4000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 827
- 已通过
- 91
- 上传者