• KMP


    博客1:KMP的介绍和解释

    博客2:next数组的应用

    代码:

    hdu 3336

    #include<stdio.h>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    const int max_=2e5+2;
    const int mod=1e4+7;
    int n;
    int nex[max_];
    char str[max_];
    void getnext()
    {
        nex[0]=-1;
        int k=-1,i=0;
        while(i<n)
        {
            while(k>-1&&str[k]!=str[i]) k=nex[k];
             nex[++i]=++k;
        }
    }
    int getsum()
    {
        getnext();
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            if(nex[i]>0)
            {
                ans=(ans+2)%mod;
            }
            else
                ans=(ans+1)%mod;
        }
        return ans;
    }
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
        scanf("%d%s",&n,str);
        int sum=getsum();
        /*for(int i=1;i<=n;i++)
            printf("%d ",nex[i]);*/
        printf("%d
    ",sum);
        }
    }

    代码:1358

    #include<stdio.h>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    const int max_=1e6+5;
    int n;
    char str[max_];
    int nex[max_];
    void getnext()
    {
        int k=-1;
        int i=0;
        nex[0]=-1;
        while(i<n)
        {
            while(k>-1&&str[k]!=str[i])
                k=nex[k];
            nex[++i]=++k;
        }
    }
    int main()
    {
        int tcase=1;
        while(~scanf("%d",&n))
        {
            if(n==0)
              break;
            scanf("%s",str);
            getnext();
            printf("Test case #%d
    ",tcase);
          for(int i=2;i<=n;i++)
          {
              int k=i-nex[i];
              if(i%k==0&&nex[i])
              {
                  int kk=i/k;
                  printf("%d %d
    ",i,kk);
              }
          }
          printf("
    ");
          tcase+=1;
        }
    }

     hdu 1711

    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int max_=1e6+5;
    int a[max_],b[max_];
    int nex[max_];
    void getnext(int n)
    {
        int k=-1,i=0;
        nex[0]=-1;
        while(i<n)
        {
            while(k>-1&&b[i]!=b[k])
                k=nex[k];
            nex[++i]=++k;
        }
    }
    int solve(int n,int m)
    {
        int i=0,j=0;
        while(i<n&&j<m)
        {
            while(j!=-1&&a[i]!=b[j])
                j=nex[j];
            i++,j++;
        }
        if(j==m)
            return i-j+1;
        else
            return -1;
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            int n,m;
            scanf("%d %d",&n,&m);
            for(int i=0;i<n;i++)
            {
                scanf("%d",&a[i]);
            }
            for(int i=0;i<m;i++)
            {
                scanf("%d",&b[i]);
            }
            getnext(m);
            printf("%d
    ",solve(n,m));
        }
    }

    hdu 1686

    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    #include<string.h>
    using namespace std;
    const int max_=1e6+5;
    char str[max_],mo[max_];
    int nex[max_];
    void getnext(int n)
    {
        int i=0,k=-1;
        nex[0]=-1;
        while(i<n)
        {
            while(k>-1&&mo[k]!=mo[i])
                k=nex[k];
            nex[++i]=++k;
        }
    }
    int solve(int n,int m)
    {
        int i=0,j=0,ans=0;
        while(i<n)
        {
            while(j>-1&&mo[j]!=str[i])
                j=nex[j];
            i++,j++;
            if(j==m)
                ans+=1;
        }
        return ans;
    }
    int main()
    {
        int t;
        scanf("%d
    ",&t);
        while(t--)
        {
            gets(mo);
            gets(str);
            getnext(strlen(mo));
            printf("%d
    ",solve(strlen(str),strlen(mo)));
        }
    }

     hdu 2087

    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    #include<string.h>
    using namespace std;
    const int max_=1e6+5;
    char str[max_],mo[max_];
    int nex[max_];
    void getnext(int n)
    {
        int i=0,k=-1;
        nex[0]=-1;
        while(i<n)
        {
            while(k>-1&&mo[k]!=mo[i])
                k=nex[k];
            nex[++i]=++k;
        }
    }
    int solve(int n,int m)
    {
        int i=0,j=0,ans=0;
        while(i<n)
        {
            while(j>-1&&mo[j]!=str[i])
                j=nex[j];
            i++,j++;
            if(j==m)
            {
                ans+=1;
                j=0;
            }
        }
        return ans;
    }
    int main()
    {
        while(scanf("%s",str))
        {
            if(str[0]=='#')
                break;
            scanf("%s",mo);
            getnext(strlen(mo));
            printf("%d
    ",solve(strlen(str),strlen(mo)));
        }
    }

    hdu  3746

    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    #include<string.h>
    using namespace std;
    const int max_=1e+5;
    int nex[max_];
    char str[max_];
    void getnext(int n)
    {
        int i=0,k=-1;
        nex[0]=-1;
        while(i<n)
        {
            while(k>-1&&str[i]!=str[k])
                k=nex[k];
            nex[++i]=++k;
        }
    }
    int solve(int n)
    {
        if(!nex[n])
            return n;
        else
         {
            int k=n-nex[n];
             if(n%k==0)
                return 0;
             return k-(n%k);
         }
    }
    int main()
    {
        int t;
        scanf("%d
    ",&t);
        while(t--)
        {
            gets(str);
            int len=strlen(str);
            getnext(len);
            printf("%d
    ",solve(len));
        }
    }

    poj 2406

    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    #include<string.h>
    using namespace std;
    const int max_=1e6+5;
    char str[max_];
    int nex[max_];
    void getnext(int n)
    {
        int i=0,k=-1;
        nex[0]=-1;
        while(i<n)
        {
            while(k>-1&&str[k]!=str[i])
                k=nex[k];
            nex[++i]=++k;
        }
    }
    int solve(int n)
    {
        int k=n-nex[n];
        if(n%k)
            return 1;
        return n/k;
    }
    int main()
    {
        while(gets(str))
        {
            if(str[0]=='.')
                break;
            int len=strlen(str);
            getnext(len);
            printf("%d
    ",solve(len));
        }
    }
  • 相关阅读:
    数组中找出最小的K个数
    温故而知新---Java(一)
    写一手简洁的代码
    同步IO与同步非阻塞IO的理解
    旋转打印矩阵
    求仅出现一次的最早字符
    spring 自定义schema 加载异常 White spaces are required between publicId and systemId.
    Java位运算知识点整理
    Idea 插件开发之DubboInvoke实践
    pinpoint插件开发实践
  • 原文地址:https://www.cnblogs.com/linhaitai/p/9879719.html
Copyright © 2020-2023  润新知