zoukankan      html  css  js  c++  java
  • Number Sequence HDU 1711 KMP 模板

    题目大意:两个数组匹配,求子串首次出现的位置。

    题目思路:数组长度,比较大,朴素算法的时间复杂度为 m*n超时。KMP的时间复杂度为m+n可行。

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<vector>
    #include<stdio.h>
    #include<stdlib.h>
    #include<queue>
    #include<math.h>
    #include<map>
    #define INF 0x3f3f3f3f
    #define MAX 1000005
    #define Temp 1000000000
    #define MOD 1000000007
    
    using namespace std;
    
    int num1[MAX],num2[MAX],n,m,Next[MAX];
    
    void getNext()
    {
        int k=-1,i=0;
        Next[0]=-1;
        while(i<m)
        {
            if(k==-1 || num2[i]==num2[k])
                Next[++i]=++k;
            else
                k=Next[k];
        }
    }
    
    int Kmp_index()
    {
        getNext();
        int i=0,j=0;
        while(i<n && j<m)
        {
            if(j==-1 || num1[i]==num2[j])
            {
                i++;
                j++;
            }
            else
                j=Next[j];
        }
        if(j==m)
            return i-m+1;
        return -1;
    }
    
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&n,&m);
            for(int i=0;i<n;i++)
                scanf("%d",&num1[i]);
            for(int i=0;i<m;i++)
                scanf("%d",&num2[i]);
            int ans=Kmp_index();
            printf("%d
    ",ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    网络资源(4)
    网络资源(3)
    网络资源(2)
    网络资源(1)
    OCP读书笔记(27)
    OCP读书笔记(26)
    OCP读书笔记(25)
    OCP读书笔记(24)
    OCP读书笔记(23)
    OCP读书笔记(22)
  • 原文地址:https://www.cnblogs.com/alan-W/p/5966609.html
Copyright © 2011-2022 走看看