[模板] [KMP] 字符串匹配

整理一下以前的模板

#include <iostream>
using namespace std;

typedef long long ll;

const int MAXN = 1e5 + 10;

string a, text;

ll pre[100010] = {-1};


void prefix_table(string mode)
{
    for(int i = 1, j = 0; i < mode.length(); i++)
    {
        if(mode[i] == mode[j])
        {
            pre[i + 1] = pre[i] + 1;

            j++;
        }
        else    //若匹配不上再次匹配时从零开始
        {
            j = 0;

            if(mode[i] == mode[j])    //从零的第一个单独判断一
            {    
                pre[i + 1] = 1;
                
                j++;
            }

        }
    }
}

int judge(int beg, int end,int lenm) //向后跳转匹配
{
    int i = beg - 1, j = 0, ans = 0;
    
    while(i < end)
    {
        if(j == lenm - 1 && text[i] == a[j])
        {
            ans++;
        }
        if(text[i] == a[j])
        {
            i++;
            j++;
        }
        else
        {
            j = pre[j];
            if(j==-1)
            {
                i++;
                j++;
            }
        }
    }
    return ans;
}


int main()
{
    int lent, lenm, t;

    cin>>lent>>lenm>>t;

    cin>>text>>a;

    prefix_table(a);
    
    while(t--)
    {
        int beg, end;

        cin>>beg>>end;
        
        cout<<judge(beg, end, lenm)<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Zeolim/article/details/81408915