zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    EF架构~终于实现了Update方法的统一
    刚刚做了个文件上传功能,拿来分享一下!(MVC架构及传统架构通用)
    关于需求分析,你不能不知道的4个必杀技:捡金子+ Warroom作战室+情节串联板+Build构建 (2/2)
    DockLayout布局
    Linux系统安装出错后出现grub rescue的修复方法
    如何批量清除128组节点db上面的过期的binlog,释放磁盘空间。
    读取Fits数据及画图显示JAVA版
    深入理解Oracle索引(17):Cost 值相同 CBO 对索引的选择
    Xeon Phi之MIC编程知识点
    WDK编译libwdi
  • 原文地址:https://www.cnblogs.com/handsomecui/p/5233496.html
Copyright © 2011-2022 走看看