Binary String Matching(kmp+str)

Binary String Matching

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
 
描述
Given two strings A and B, whose alphabet consist only ‘0’ and ‘1’. Your task is only to tell how many times does A appear as a substring of B? For example, the text string B is ‘1001110110’ while the pattern string A is ‘11’, you should output 3, because the pattern A appeared at the posit
 
输入
The first line consist only one integer N, indicates N cases follows. In each case, there are two lines, the first line gives the string A, length (A) <= 10, and the second line gives the string B, length (B) <= 1000. And it is guaranteed that B is always longer than A.
输出
For each case, output a single line consist a single integer, tells how many times do B appears as a substring of A.
样例输入
3
11
1001110110
101
110010010010001
1010
110100010101011 
样例输出
3
0
3 
题解:串a在串b中出现多少次,简单kmp,strstr函数也可以;
strstr代码:
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cstdlib>
using namespace std;
const int INF=0x3f3f3f3f;
#define mem(x,y) memset(x,y,sizeof(x))
#define SI(x) scanf("%d",&x)
#define PI(x) printf("%d",x)
typedef long long LL;
const int MAXN=1010;
char A[15],B[MAXN];
int main(){
    int N;
    SI(N);
    while(N--){
        scanf("%s%s",A,B);
        int ans=0,t=-1;
        while(true){
            if(strstr(B+t+1,A))t=strstr(B+t+1,A)-B;
            else break;
            ans++;
        }
        printf("%d
",ans);
    }
    return 0;
}

kmp

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cstdlib>
using namespace std;
const int INF=0x3f3f3f3f;
#define mem(x,y) memset(x,y,sizeof(x))
#define SI(x) scanf("%d",&x)
#define PI(x) printf("%d",x)
typedef long long LL;
const int MAXN=1010;
char A[15],B[MAXN];
int p[MAXN];
void getp(){
    int i=0,j=-1;
    p[0]=-1;
    int len=strlen(A);
    while(i<len){
        if(j==-1||A[j]==A[i]){
            i++;j++;
            p[i]=j;
        }
        else j=p[j];
    }
}
int kmp(){
    getp();
    int i=0,j=0;
    int len=strlen(B);
    int ans=0;
    while(i<len){
        if(j==-1||B[i]==A[j]){
            i++;j++;
            if(j==strlen(A))ans++;
        }
        else j=p[j];
    }
    return ans;
}
int main(){
    int T;
    SI(T);
    while(T--){
        scanf("%s%s",A,B);
        printf("%d
",kmp());
    }
    return 0;
}
原文地址:https://www.cnblogs.com/handsomecui/p/5233496.html