程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> kmp&&hdu 1711 next數組

kmp&&hdu 1711 next數組

編輯:C++入門知識

kmp這幾天一直都在搞這個,今天A了hdu的1711這題,就是簡單的kmp模板題;

kmp的核心就是next數組;這幾天一直在看嚴蔚敏的數據結構課本,上面介紹的是

next[j]={

                 0,j==1,


max{k| 1<k<j,且P1P2'……Pk-1==Pj-k+1........Pj-1},

1,

}

next[j]表示1到k-1中最長首尾重復子串的長度+1,也就是當模式串的第[j]個和文本串中的第[i]個不匹配時,主串指針i不用回溯,而只需模式串的j=next[j],假設文本串是S,模式串是P則下次S[i]和P[next[j]]比較,j應該回溯到next[j];
 


 
#include<stdio.h>   
#include<iostream>   
#include<cmath>   
#include<algorithm>   
#include<string>   
#include<vector>   
#include<cstring>   
using namespace std;  
const int N=1000003;  
int next[N];  
int a[N],b[N];  
void getNext( int str[], int pos ,int len) {  
  
    if(next == NULL || str == NULL )  
        return ;  
  
        next[0] = -1;  
  
        int i=pos,j=-1;  
  
        while( i < len) {  
  
            if(j == -1 || str[i] == str[j]) {  
                i++;  
                j++;  
                next[i] = j;//   
            }  
            else {  
                j=next[j];  
            }  
        }  
}  
int main()  
{  
//freopen("1.txt","r",stdin);   
//freopen("2.txt","w",stdout);   
     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(b,0,m);  
        int i=0,j=0;  
        while(i<n && j<m ){  
            if(j == -1 || a[i] == b[j]){  
                i++;  
                j++;  
            }  
            else{  
                j=next[j];  
            }  
        }  
        if(j==m){  
            printf("%d\n",i-m+1);  
        }else{  
            printf("-1\n");  
        }  
    }  
    return 0;  
  
}  

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved