1 条题解

  • 1
    @ 2025-10-16 11:24:22
    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    
    // 计算KMP算法的部分匹配表(prefix function)
    vector<int> computePrefixFunction(const string& pattern) 
    {
        int m = pattern.size();
        vector<int> pi(m, 0);
        int k = 0;
        for (int i = 1; i < m; i++) 
    	{
            while (k > 0 && pattern[k] != pattern[i]) 
    		{
                k = pi[k-1];
            }
            if (pattern[k] == pattern[i]) 
    		{
                k++;
            }
            pi[i] = k;
        }
        return pi;
    }
    
    // 使用KMP算法搜索并计数pattern在text中出现的次数
    int kmpSearch(const string& text, const string& pattern) 
    {
        int n = text.size();
        int m = pattern.size();
        if (m == 0) return 0; // 处理空模式字符串
        vector<int> pi = computePrefixFunction(pattern);
        int k = 0; // 已匹配的字符数
        int count = 0; // 出现次数计数
        for (int i = 0; i < n; i++) 
    	{
            while (k > 0 && pattern[k] != text[i]) 
    		{
                k = pi[k-1]; // 调整匹配位置
            }
            if (pattern[k] == text[i]) 
    		{
                k++;
            }
            
            if (k == m) 
    		{
                count++; // 找到匹配
                k = pi[m-1]; // 允许重叠匹配
            }
        }
        return count;
    }
    
    int main() 
    {
        string a, b;
        getline(cin, a); // 读取字符串a
        getline(cin, b); // 读取字符串b
        int result = kmpSearch(a, b);
        cout << result << endl; // 输出结果
        return 0;
    }
    
    

    信息

    ID
    123
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者