hdu-1686(kmp)

题意:前面的都是废话。。。其实直接看输入要求和输出要求就可以了,就是给你两个字符串,问你第一个字符串在第二个字符串中出现几次;

解题思路:kmp。。。

代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#define M 10050
#define N 1005000
using namespace std;
int next1[M];
char s[N];
char t[M];
int slen,tlen;
void  get_next()
{
    int j=0,k=-1;
    next1[0]=-1;
    while(j<tlen)
    {
        if(k==-1||t[j]==t[k])
        {
            next1[++j]=++k;
        }
        else
            k=next1[k];
    }
}
int kmp_cnt()
{
    int ans=0,i=0,j=0;
    if(slen==1&&tlen==1)
    {
        if(s[0]==t[0])
            return 1;
        else
            return 0;
    }
    get_next();
    for(int i=0;i<slen;i++)
    {
        while(j>0&&s[i]!=t[j])
            j=next1[j];
        if(s[i]==t[j])
            j++;
        if(j==tlen)
        {
            ans++;
            j=next1[j];
        }
    }
    return ans;
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int tt;
    cin>>tt;
    while(tt--)
    {
        cin>>t;
        cin>>s;
        tlen=strlen(t);
        slen=strlen(s);
        cout<<kmp_cnt()<<endl;
    }
}

  

posted @ 2018-07-08 19:45  荒岛的龟  阅读(110)  评论(0编辑  收藏  举报