• 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
  • 相关阅读:
    Web API总结
    @Html.Raw() 方法输出带有html标签的字符串
    jQuery
    图与树基础-完全图的判定
    图和树基础-蒜头君旅行
    PAT乙级1008
    PAT乙级1007
    PAT乙级1005
    PAT乙级1001
    前端工程化-webpack简介(一)
  • 原文地址:https://www.cnblogs.com/alan-W/p/5966609.html
Copyright © 2020-2023  润新知