HDU-#2087 剪花布条(KMP & strstr)

来源:互联网 发布:流体热力学软件 编辑:程序博客网 时间:2024/04/30 14:08

      题目大意:给出一个字符串,以及模板串,求字符串中有多少个模板串即子串?

      解题思路:该题有两种做法,一是直接利用库函数中strstr()函数求解,每次找到一个就将其下标下移即可;二是利用kmp进行匹配,这是基础的kmp应用。两种解法详见code。

      题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=2087

     code:

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int MAXN = 1000+10;char str[MAXN],pat[MAXN];char next[MAXN];int lenp,lens;void getFail(){ //失配函数    int i=0,j=-1;    next[0]=-1;    while(i<lenp){        if(j==-1 || pat[i]==pat[j]){            i++;j++;            next[i]=j;        }        else j=next[j];    }}int kmp(){ //kmp()函数    int sum=0;    if(lenp>lens) return 0;    else{        int i=0,j=0;        while(i<lens){            if(j==-1 || str[i]==pat[j]){                i++;j++;            }            else j=next[j];            if(j==lenp){ //匹配完成一个串,将j置0,进入下一次匹配                j=0;                sum++;            }        }        return sum;    }}int str_str(){//strstr()函数    char *p=0;    char *k=str;    int ans=0;    while((p=strstr(k,pat))!=0){        ans++;        k=p+lenp;    }    return ans;}int main(){    memset(str,0,sizeof(str));    memset(pat,0,sizeof(pat));    while(scanf("%s",&str)!=EOF && str[0]!='#'){        scanf("%s",&pat);        lens=strlen(str);        lenp=strlen(pat);        //kmp()函数        getFail();        int ans=kmp();        //strstr()函数        int ans=str_str();        printf("%d\n",ans);    }    return 0;}


0 0