kmp

来源:互联网 发布:网络协议对应层次 编辑:程序博客网 时间:2024/06/05 18:03
#include<iostream>#include<vector>#include<string>using namespace std;void getNext(vector<int> &next, const string &pattern){    next[1] = 0;    int k = 0;    for(int q=2;q<=pattern.length();++q)    {        while((k>0) && (pattern[k] != pattern[q-1]))            k = next[k];        if(pattern[k]==pattern[q-1])            ++k;        next[q] = k;    }}int kmp(const vector<int> &next, const string &pattern, const string &str){    int result = 0;    int q = 0;    for(int i=0;i<str.length();++i)    {        while(q>0 && pattern[q] != str[i])            q = next[q];        if(pattern[q] == str[i])            ++q;        if(q == pattern.length())        {            ++result;            q = next[q];        }    }    return result;}int main(){    int n;    string pattern,str;    cin>>n;    while(n)    {        cin>>pattern>>str;        vector<int> next(pattern.length()+1,0);        getNext(next,pattern);        cout<<kmp(next,pattern,str)<<endl;        --n;    }    return 0;}

0 0
原创粉丝点击