hdu 1686 kmp统计匹配数

裸题,直接计数就可以

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#define MAX 1000707

using namespace std;

void get_next ( char p[] , int next [] )
{
    int i = 0 , k = -1 , len = strlen ( p );
    next[0] = -1;
    while ( i < len )
        if ( k == -1 || p[i] == p[k] )
            i++,k++,next[i]=k;
        else k = next[k];
}

int ans,t;
char s[MAX],p[MAX/100];

int match ( char s[] , char p[] )
{
    int next[MAX/100];
    ans = 0;
    get_next ( p , next );
    int len1 = strlen ( s );
    int len2 = strlen ( p );
    int i = 0 , j = 0;
    while ( i < len1 )
    {
        if ( j == -1 || s[i] == p[j] ) i++,j++;
        else j = next[j];
        if ( j == len2 ) ans++;
    }
    return ans;
}

int main ( )
{
    scanf ( "%d" , &t );
    while ( t-- )
    {
        scanf ( "%s" , p );
        scanf ( "%s" , s );
        printf ( "%d\n" , match ( s , p ) );
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值