题意:给出两个数组,在第一个数组里面找是否有第二个数组,有输出位置,没有就输出-1(差不多就这意思)
思路:KMP的一个模板,直接用模板就可以
AC代码:
import java.io.*;
import java.math.*;
import java.math.BigInteger;
import java.util.*;
public class Main{
public static void prefix_table(int pattern[],int prefix[],int n) {
prefix[0]=0;
int len=0;
int i=1;
while(i<n) {
if(pattern[i]==pattern[len]) {
len++;
prefix[i]=len;
i++;
}else {
if(len>0)len=prefix[len-1];
else {
prefix[i]=0;
i++;
}
}
}
}
public static void move_prefix_table(int prefix[],int n) {
for(int i=n-1;i>0;i--) {
prefix[i]=prefix[i-1];
}
prefix[0]=-1;
}
public static void kmp_search(int text[],int pattern[]) {
int n=pattern.length;
int m=text.length;
int prefix[]=new int [n];
prefix_table(pattern,prefix,n);
move_prefix_table(prefix,n);
//text[i],len(text)=m
//pattern[j] , len(pattern)=n
int i=0;
int j=0;
while(i<m) {
if(j==n-1&&text[i]==pattern[j]) {
System.out.println(i-j+1);
//j=prefix[j];
return;
}
if(text[i]==pattern[j]) {
i++;
j++;
}else {
j=prefix[j];
if(j==-1) {
i++;
j++;
}
}
}
System.out.println(-1);
}
public static void main(String[] args) {
Scanner sc=new Scanner (System.in);
for(int t=sc.nextInt();t>0;t--) {
int n=sc.nextInt();
int m=sc.nextInt();
int text[]=new int [n];
int pattern[]=new int [m];
for(int i=0;i<n;i++) {
text[i]=sc.nextInt();
}
for(int i=0;i<m;i++) {
pattern[i]=sc.nextInt();
}
kmp_search(text,pattern);
}
}
}