POJ3461KMP模板

来源:互联网 发布:虚拟机的网络模式 编辑:程序博客网 时间:2024/06/08 13:17

模板水题,问子串t在母串s中出现的次数
注意:用cin读入会超时,要用scanf

/*pku3461(Oulipo), hdu1711(Number Sequence)这个模板 字符串是从0开始的Next数组是从1开始的*/#include <iostream>#include <cstring>#include <cstdio>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;    scanf("%d",&TT);    while(TT--)    {        scanf("%s%s",&T,&S);        slen = strlen(S);        tlen = strlen(T);        cout<<KMP_Count()<<endl;    }    return 0;}/*test caseaaaaaa aabcd daabaa b*/
原创粉丝点击