HDU 1711 Number Sequence---KMP原始

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<vector>
#include<queue>
#include<stack>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

#define MaxSize 1000005
#define inf 0x3f3f3f3f
#define LL long long int

int n,m;
int ori[MaxSize],tar[MaxSize],NEXT[MaxSize];//有点醉,本来写的next和algorithm库里面的东西重名CE了。所以用不着的头文件别乱写。

void get_NEXT()
{
  int i=0;//i是指在目标串中走到了i位
  int j=NEXT[0]=-1;//把这里设置成-1,而不是0,是非常巧妙的。j一直都是NEXT[i]

  while(i<m)//得到目标串的NEXT,注意范围
    {
      if(j==-1 || tar[j]==tar[i])//j==-1有两种情况,第一个是刚开始从第0位开始的时候,第二个是后面找不到相同的前缀后一位的时候
        NEXT[++i] = ++j;

      else
        j=NEXT[j];

      /*如果一直这样代换下去,走到j=0的时候,然后进行下一次循环:j==-1不满足,
      于是就比较tar[0]和tar[i],就是a.....|b的第一位a和现在在i位上的b比较。
      如果j==0的时候tar[0]==tar[i]还不满足,说明前面所有的前缀的之后一位都没有和当前i位一样的。
      那就应该有NEXT[++i]=0。在代码中,如果j==0的时候tar[0]==tar[i]还不满足,j就会走到-1,
      (因为我们设置的NEXT[0]=-1)。于是下一步循环的时候,++j就就恰是0,于是NEXT[++i]=0,就是巧妙在这里*/
    }
}

int match()
{
  int i=0;//i是指在原始串中走到了i位置
  int j=0;//j是指在目标串中走到了j位置

  while(i<n)//在原始串中从头到尾匹配,如果走到最后,过程中都没有return,说明没有找到匹配。最后while结束后就返回-1
    {
      if(j==-1 || ori[i]==tar[j])//一位一位匹配下去
        {
          i ++;
          j ++;
        }

      else//走到某一位的时候发现不能匹配,那么就移位。移位之后,j就跑到前缀的后一位,然后继续往后匹配。当然此时的i是不应该变的。
        j=NEXT[j];
        /*如果j代换到了j==0,(原始串:....a.....,目标串b.....)那么就是用当前原始串的第i位a比较目标串第一位b
        如果还不能匹配,那么j就代换成-1,,原始串的i就到下一位,目标串的j本来是-1,加1之后就变成0,也就是又从第一位开始比较
        巧妙的=NEXT[0]=-1。*/

      if (j == m) return i-m+1;//匹配完了,j就会走到目标串的最后一位(即m-1位)之后,j++就变成了m,这里就应该return了。
    }

  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",&ori[i]);

      for(int i=0; i<m; i++)
        scanf("%d",&tar[i]);

      get_NEXT();
      /*for(int i=0;i<m;i++)
        printf("%d ",NEXT[i]);printf("\n");*/
      printf("%d\n",match());
    }

  return 0;
}
时间: 2024-10-28 16:10:35

HDU 1711 Number Sequence---KMP原始的相关文章

hdu 1711 Number Sequence(KMP)

# include <stdio.h> # include <string.h> # include <algorithm> using namespace std; int n,m,next[10010],a[1000010],b[10010]; void Getnext() { int i=0,j=-1; next[0]=-1; while(i<m) { if(j==-1||b[i]==b[j]) i++,j++,next[i]=j; else j=next[

HDU 1711 Number Sequence KMP题解

KMP查找整数数列,不是查找字符串. 原理是一样的,不过把字符串转换为数列,其他基本上是一样的. #include <stdio.h> #include <string.h> const int MAX_N = 1000001; const int MAX_M = 10001; int strN[MAX_N], strM[MAX_M], next[MAX_M], N, M; void getNext() { memset(next, 0, sizeof(int) * M); for

HDU - 1711 Number Sequence KMP字符串匹配

HDU - 1711 Number Sequence Time Limit: 5000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Status Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], ...... , b[M] (1 <= M <= 10000, 1 <=

HDU 1711 Number Sequence(KMP算法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 15548    Accepted Submission(s): 6836 Problem Description Given two sequence

hdu 1711 Number Sequence KMP 基础题

Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11691    Accepted Submission(s): 5336 Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1],

(KMP 1.1)hdu 1711 Number Sequence(KMP的简单应用——求pattern在text中第一次出现的位置)

题目: Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 12902    Accepted Submission(s): 5845 Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1

HDU 1711 Number Sequence(KMP模板)

Problem Description: Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], ...... , b[M] (1 <= M <= 10000, 1 <= N <= 1000000). Your task is to find a number K which make a[K] = b[1], a[K + 1] = b[2], ...... , a[K + M - 1]

hdu 1711 Number Sequence KMP模板题

题意:给你两个数组,求第二个数组在第一个数组中的位置,若不存在,则输出-1. #include <cstdio> #include <cmath> #include <iostream> #include <string.h> #include <algorithm> using namespace std; int d[10005]; int f[1000005]; int Next[20005]; void KMP(int s[],int l

KMP算法的定义及KMP练手题 HDU 1711 Number Sequence (我的模板代码)

题意:就是要你来找出b数组在a数组中最先匹配的位置,如果没有则输出-1 思路:直接KMP算法(算法具体思想这位牛写的不错http://blog.csdn.net/v_july_v/article/details/7041827) AC代码: #include<cstdio> #include<cstring> #include<stdlib.h> #include<iostream> using namespace std; #define maxn 100

HDU 1711 Number Sequence(字符串匹配)

Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10571    Accepted Submission(s): 4814 Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1],