poj_3461: Oulipo

时间:2021-12-04 19:52:55

题目链接

基础KMP题,本文提供一段能AC并且便于调试以及查看next数组的代码。

参考博客

http://blog.csdn.net/v_july_v/article/details/7041827

http://www.cnblogs.com/kuangbin/archive/2012/08/14/2638803.html

#include<iostream>
#include<cstring>
using namespace std;

;
int next[N];
char S[N],T[N];        //T为模式串,S为主串
int slen,tlen;

//    第一步先学习写好这个函数
int KMP_Index()
{
    ,j=;
    while(i<slen&&j<tlen)
    {
        ||S[i]==T[j])
            i++,j++;
        else
            j=next[j];
    }
    if(j==tlen)
        return i-tlen+1;  //标号从0开始
    else
        ;
}
//    第二步学习写好这个函数
int KMP_Count()
{
    ;
    ;
    &&tlen==)
        ]==T[];
    ;i<slen;i++)
    {
        &&S[i]!=T[j])
            j=next[j];
        if(S[i]==T[j])
            j++;
        if(j==tlen)
        {
            ret++;
            j=next[j];
        }
    }
    return ret;
}
//    第三步,本着满足前两个函数的需求这一目标,来学习写好这个函数
//    而这一步,正是KMP算法精华所在
void getNext()
{
    int j,k;
    j=;k=-;next[]=-;
    while(j<tlen)
        ||T[j]==T[k])
            next[++j]=++k;
        else
            k=next[k];
}
void printNext()
{
    ;i<tlen;i++)
        printf("%3c",T[i]);
    puts("");
    ;i<tlen;i++)
        printf("%3d",next[i]);
    puts("");
}
int main()
{
//    while(cin>>T)
//        tlen=strlen(T),getNext(),printNext();
    int tt;cin>>tt;
    while(tt--)
    {
        cin>>T>>S;
        slen=strlen(S);
        tlen=strlen(T);
        getNext();
        printNext();
        cout<<KMP_Count()<<endl;
//        for(int i=0;i<tlen;i++)
//            printf("%d",next[i]);
//        puts("");
//        cout<<"模式串T在主串S中首次出现的位置是: "<<KMP_Index()<<endl;
//        cout<<"模式串T在主串S中出现的次数为: "<<KMP_Count()<<endl;
    }
}