KMP 模板

来源:互联网 发布:c语言基础 编辑:程序博客网 时间:2024/06/14 03:56
这个模板 字符串是从0开始的Next数组是从1开始的*/#include <iostream>#include <cstring>using namespace std;const int N = 1000002;int next[N];char S[N], T[N];int slen, tlen;void getNext(){    int j, k;    j = 0; k = -1; next[0] = -1;    while(j < tlen)        if(k == -1 || T[j] == T[k])            next[++j] = ++k;        else            k = next[k];}/*返回模式串T在主串S中首次出现的位置返回的位置是从0开始的。*/int KMP_Index(){    int i = 0, j = 0;    getNext();    while(i < slen && j < tlen)    {        if(j == -1 || S[i] == T[j])        {            i++; j++;        }        else            j = next[j];    }    if(j == tlen)        return i - tlen;    else        return -1;}/*返回模式串在主串S中出现的次数*/int KMP_Count(){    int ans = 0;    int i, j = 0;    if(slen == 1 && tlen == 1)    {        if(S[0] == T[0])            return 1;        else            return 0;    }    getNext();    for(i = 0; i < slen; i++)    {        while(j > 0 && S[i] != T[j])            j = next[j];        if(S[i] == T[j])            j++;        if(j == tlen)        {            ans++;            j = next[j];        }    }    return ans;}int main(){        int TT;    int i, cc;    cin>>TT;    while(TT--)    {        cin>>S>>T;        slen = strlen(S);        tlen = strlen(T);        cout<<"模式串T在主串S中首次出现的位置是: "<<KMP_Index()<<endl;        cout<<"模式串T在主串S中出现的次数为: "<<KMP_Count()<<endl;    }    return 0;}/*test case4aaaaaa aabcd daabaa b*/
原创粉丝点击