import java.util.ArrayList; import java.util.List; import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 int t = in.nextInt(); for (int i = 0; i < t; i++) { int m = in.nextInt(); int n = in.nextInt(); char[][] mn = new char[m][n]; List<WordFirstIndex> wordFirstIndexArray = new ArrayList<WordFirstIndex>(); for (int j = 0; j < m; j++) { String line = in.next(); mn[j] = line.toCharArray(); } String word = in.next(); char[] worChar = word.toCharArray(); char wordFirst = worChar[0]; for (int j = 0; j < m; j++) { for (int k = 0; k < n; k++) { // System.out.println("j=" + j + ",k=" + k); if (mn[j][k] == wordFirst) { WordFirstIndex wordFirstIndex = new WordFirstIndex(); wordFirstIndex.x = j; wordFirstIndex.y = k; wordFirstIndexArray.add(wordFirstIndex); } } } int inFirstWordCount = wordFirstIndexArray.size(); int count = 0; for (int j = 0; j < inFirstWordCount; j++) { WordFirstIndex wordFirstIndex = wordFirstIndexArray.get(j); int x = wordFirstIndex.x; int y = wordFirstIndex.y; //单词长度 int worCharLen = worChar.length; //向右 if (y + worCharLen <= n) { char[] match = new char[worCharLen]; for (int k = 0; k < worCharLen; k++) { match[k] = mn[x][y + k]; } if (word.equals(new String(match))) { count++; } } //向下 if (x + worCharLen <= m) { char[] match = new char[worCharLen]; for (int k = 0; k < worCharLen; k++) { match[k] = mn[x + k][y]; } if (word.equals(new String(match))) { count++; } } //斜向下45° if (x + worCharLen <= m && y + worCharLen <= n) { char[] match = new char[worCharLen]; for (int k = 0; k < worCharLen; k++) { match[k] = mn[x + k][y + k]; } if (word.equals(new String(match))) { count++; } } } System.out.println(count); } } static class WordFirstIndex { int x; int y; } }