zoukankan      html  css  js  c++  java
  • 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("
    ");*/
          printf("%d
    ",match());
        }
    
      return 0;
    }
  • 相关阅读:
    职工工资管理系统 c++课程设计
    我的Python自学之路四,字符串的学习
    我的Python自学之路三:元组及字典学习总结
    我的Python自学之路二:列表学习
    我的Python自学之路一:Python学习路线
    vue项目里在微信浏览器调用微信分享及支付一些页面数据的坑
    vue 三种传值方法
    vue里swiper的一些坑
    js 数据导出为txt文件
    js 小数计算为啥和想象中不一样!
  • 原文地址:https://www.cnblogs.com/kimsimple/p/6923013.html
Copyright © 2011-2022 走看看