题目解答:
import java.util.Arrays;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
for (int i = 0; i < n; i++) {
char[] p = scanner.next().toCharArray();
char[] s = scanner.next().toCharArray();
int[] next = new int[10005];
Arrays.fill(next, -1);
getNextVal(p, next);
int count = kmpSearch(s, p, next);
System.out.println(count);
}
}
public static int kmpSearch(char[] s, char[] p, int[] next) {
int i = 0, j = 0;
int sLen = s.length;
int plen = p.length;
int count = 0;
while (i < sLen) {
if (j == -1 || s[i] == p[j]) {
i++;
j++;
} else {
j = next[j];
}
if (j == plen) {
count++;
j = next[j];
}
}
return count;
}
public static void getNextVal(char[] p, int[] next) {
int pLen = p.length;
next[0] = -1;
int k = -1;
int j = 0;
while (j < pLen) {
if (k == -1 || p[k] == p[j]) {
k++;
j++;
next[j] = k;
} else {
k = next[k];
}
}
}
}