• HDUOJ------1711Number Sequence


    Number Sequence

    Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9114    Accepted Submission(s): 4166

    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] = b[M]. If there are more than one K exist, output the smallest one.
     
    Input
    The first line of input is a number T which indicate the number of cases. Each case contains three lines. The first line is two numbers N and M (1 <= M <= 10000, 1 <= N <= 1000000). The second line contains N integers which indicate a[1], a[2], ...... , a[N]. The third line contains M integers which indicate b[1], b[2], ...... , b[M]. All integers are in the range of [-1000000, 1000000].
     
    Output
    For each test case, you should output one line which only contain K described above. If no such K exists, output -1 instead.
     
    Sample Input
    2
    13 5
    1 2 1 2 3 1 2 3 1 3 2 1 2
    1 2 3 1 3
    13 5
    1 2 1 2 3 1 2 3 1 3 2 1 2
    1 2 3 2 1
     
    Sample Output
    6
    -1
     
    Source
    kmp 基础
    代码:
     1 /*@kmp扩展@龚细军*/
     2 #include<stdio.h>
     3 #include<string.h>
     4 int aa[1000004],bb[10005];
     5 int next[10005];
     6 //依旧使用next数组
     7 void get_next(int *pt,int len)
     8 {
     9     memset(next,0,sizeof(next));
    10     int i=0,j=-1;
    11     next[0]=-1;
    12     while(i<len)
    13     {
    14         if(j==-1||pt[i]==pt[j])
    15         {
    16          ++i;
    17          ++j;
    18          if(pt[i]!=pt[j])
    19              next[i]=j;
    20          else
    21              next[i]=next[j];
    22         }
    23         else
    24             j=next[j];
    25     }
    26 }
    27 //kmp的扩展
    28 int exd_kmp(int *ps,int *pt,int lens,int lent)
    29 {
    30     int i=-1,j=-1;
    31     get_next(pt,lent);
    32     while(i<lens)
    33     {
    34         if(j==-1||ps[i]==pt[j])
    35         {
    36             ++i;
    37             ++j;
    38         }
    39         else
    40             j=next[j];
    41      if(j==lent)break;
    42     }
    43     if(j==lent)
    44         return i-j+1;
    45     else
    46         return -1;
    47 }
    48 
    49 int main()
    50 {
    51     int test,n,m,i;
    52     scanf("%d",&test);
    53     while(test--)
    54     {
    55         scanf("%d%d",&n,&m);
    56         for(i=0;i<n;i++)
    57             scanf("%d",&aa[i]);
    58         for(i=0;i<m;i++)
    59             scanf("%d",&bb[i]);
    60         printf("%d
    ",exd_kmp(aa,bb,n,m));
    61     }
    62     return 0;
    63 }
    View Code
     java代码:
     1 import java.util.Scanner;
     2 
     3 
     4 public class Main {
     5     
     6     public static void main(String args [])
     7     {  
     8         mt aa = new mt();
     9        Scanner reader =new Scanner(System.in);
    10        int test=reader.nextInt();
    11        while((test--)>0)
    12        {
    13           aa.lena=reader.nextInt();
    14           aa.lenb=reader.nextInt();
    15           aa.init(aa.lena+1, aa.lenb+1);
    16           for(int i=0;i<aa.lena;i++)
    17             aa.a[i]=reader.nextInt();
    18           for(int i=0;i<aa.lenb;i++)
    19             aa.b[i]=reader.nextInt();
    20              kmp(aa);
    21        }
    22     }
    23     private static void kmp(mt aa)
    24     {
    25       int i,j;
    26       aa.next[i=0]=-1;
    27       j=-1;
    28       while(i<aa.lenb)
    29       {
    30         if(j==-1||aa.b[i]==aa.b[j])
    31         {
    32             i++;
    33             j++;
    34           if(aa.b[i]==aa.b[j])
    35              aa.next[i]=aa.next[j];
    36           else 
    37              aa.next[i]=j;
    38         }
    39         else
    40             j=aa.next[j];
    41       }
    42       i=j=0;
    43       while(i<aa.lena&&j<aa.lenb)
    44       {
    45           if(j==-1||aa.a[i]==aa.b[j])
    46           {
    47              i++;
    48              j++;
    49           }
    50           else    j=aa.next[j];
    51       }
    52       if(j==aa.lenb)
    53           out(i-aa.lenb+1);
    54       else
    55          out(-1);
    56     }
    57     private static void out(int aa)
    58     {
    59         System.out.println(aa);    
    60     }
    61 }
    62 class mt
    63 {
    64     int [] b,a,next;
    65     int  lena,lenb;
    66     void init(int lena,int lenb)
    67     { 
    68            a=new int [lena];
    69            b=new int [lenb];
    70        next =new int [lenb];
    71     }
    72 }
    View Code
  • 相关阅读:
    .Net使用分布式缓存 C# 使用Redis
    微信申请退款API~~开发
    微信支付和支付宝支付分账接口文档
    Android xUtils3.0使用手册(一)- 基础功能使用
    支付宝支付开发——当面付条码支付和扫码支付
    vue开源项目汇总
    Azure和插件发布
    SqlServer数据库优化笔记
    企业微信通过PostMan获取accesstoken与管理员信息方法
    VisualStudio插件自动加载
  • 原文地址:https://www.cnblogs.com/gongxijun/p/3481179.html
Copyright © 2020-2023  润新知