4 条题解

  • 1
    @ 2025-10-11 10:57:15

    解题思路

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