poj 3461 字符串-KMP

昨晚本来想看一下数据结构的作业……突然发现第三章有KMP算法,抱着慕名已久的心态一看就入迷……(突然发现吉大的数据结构书貌似还不错)

看完理解算法的步骤之后开始写自己实现代码。。。

期间虽然偷偷瞄过几眼书上那ADT代码,绝大部分还是自己写得。

鉴于这道题是KMP水题(只是用来看看自己写得KMP对不对……)我就不解释什么了。自己上网看懂KMP教程就ok。


照旧:不建议观摩他人代码=。 =

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
const int Max = 1001000;
int next[Max];
char s[Max],p[Max];
int ans = 0;
void make_next()
{
    memset(next, 0, sizeof(next));
    next[0] = -1;
//    for(int i=1; i<p.length(); i++)
    for(int i=1; p[i] != 0; i++)
    {
        int j = i-1;
        while(j>=0 && p[next[j]+1] != p[i])
            j = next[j];

        if(p[j+1] == p[i])
            next[i] = next[j]+1;
        else
            next[i] = -1;
    }
}
void kmp()
{
    int vis = 1;
    int top_p = 0;
    int top_s = 0;
//    while(top_s < s.length())
    while(s[top_s] != 0)
    {
        if(s[top_s] == p[top_p])
        {
            top_s++;top_p++;
//            if(top_p == p.length())
            if(p[top_p] == 0)
            {
                ans++;
                top_p = next[--top_p] + 1;
            }
            continue;
        }
        else
        {
//            while(top_p>0 && s[top_s] != s[next[top_p-1]+1])
//                top_p = next[top_p - 1] + 1;
            if(top_p==0)
            {
                if(s[top_s+1] == 0) break;
                else                top_s++;
            }
            else if(top_p < 0)
                break;
            else
                top_p = next[top_p-1] + 1;
//            top_p = next[--top_p]+1;
        }
    }
}
int main()
{
//    freopen("123.txt","r",stdin);
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s %s",p,s);
        ans = 0;
        make_next();
//        for(int i=0; p[i]!=0; i++)
//            printf("next[i]:%d\n",next[i]);
        kmp();
        printf("%d\n",ans);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值