zoukankan      html  css  js  c++  java
  • Hdoj 1686 Oulipo

    /*
    Problem :
    Status  :
    
    By wf,
    */
    
    #include "algorithm"
    #include "iostream"
    #include "cstring"
    #include "cstdio"
    #include "string"
    #include "stack"
    #include "cmath"
    #include "queue"
    #include "set"
    #include "map"
    
    #define lson l , m , rt << 1
    #define rson m + 1 , r , rt << 1 | 1
    
    typedef long long ll;
    using namespace std;
    
    const int inf=0x3f3f3f3f;
    const int maxn=1e6+5;
    
    
    char sub[10000+5];
    char str[maxn];
    
    //刘汝佳
    int f[10000+5];
    void getFail(char* P,int * f)
    {
        int m = strlen(P);
        f[0]=0;f[1]=0;
        for(int i=1;i<m;++i)
        {
            int j = f[i];
            while(j && P[i]!=P[j])j=f[j];
            f[i+1] = P[i]==P[j] ? j+1 :0;
        }
    }
    
    void kmp(char*T,char * P,int *f)
    {
        int ret = 0;
        int n = strlen(T),m = strlen(P);
        getFail(P,f);
        int j=0;
        for(int i=0;i<n;++i)
        {
            while(j && P[j]!=T[i]) j = f[j];
            if(P[j]==T[i])j++;
            if(j==m)
            {
                ret++;
                //printf("%d
    ",i-m+1);
            }
    
        }
        printf("%d
    ",ret);
    }
    
    /*
    kuangbin
    void getFail(char P[],int f[])
    {
        int m = strlen(P);
        int i=0,j=-1;
        f[0]=-1;
        while(i<m)
        {
           while(-1!=j && P[i]!=P[j])j=f[j];
           f[++i]=++j;
        }
        for(int i=0;i<m;++i)printf("%d ",f[i]);
        printf("
    ");
    }
    
    void kmp(char T[],char P[],int f[])
    {
        int ret = 0;
        int n = strlen(T),m = strlen(P);
        //printf("n==%d , m==%d
    ",n,m);
        getFail(P,f);
        int i=0,j=0;
        while(i<n )
        {
            while(-1!=j && T[i]!=P[j])j=f[j];
            ++i;++j;
            if(j>=m)
            {
                ret++;
                j=f[j];
            }
        }
        printf("ret==%d
    ",ret);
    }
    */
    
    int main()
    {
        //freopen("in.txt","r",stdin);
        int t;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%s",&sub);
            scanf("%s",&str);
            //printf("%s
    ",sub);
            //printf("%s
    ",str);
            kmp(str,sub,f);
        }
    
        return 0;
    }
    

      

  • 相关阅读:
    正则与普通方法对字符串过滤的比较
    java基础练习笔记
    node.js-express路由基础+获取前端数据+rmvc架构开发
    解决powershell因为在此系统上禁止运行脚本"报错
    树、森林、二叉树的转换
    git提交代码时如何不提交node_modules文件
    node.js-静态资源目录搭建
    node.js路由基础
    sql server查询练习
    MYQL存储过程与事件
  • 原文地址:https://www.cnblogs.com/bruce27/p/5484541.html
Copyright © 2011-2022 走看看