int solve(){ memset(matchLineCnt, 0, sizeof(matchLineCnt)); ac.reset(); for (int i = 0; i < X; i++) ac.insert(patternMat[i], i, Y); ac.getFail(); for (int i = 0; i < N; i++){ int u = 0; for (int j = 0; j < M; j++){ int c = ac.idx(textMat[i][j]); u = ac.ch[u][c]; for (size_t k = 0; k < ac.val[u].size(); k++){ int ln = ac.val[u][k]; if (i - ln >= 0 && j + 1 - Y >= 0){ matchLineCnt[i - ln][j + 1 - Y]++; } } } } int total = 0; for (int i = 0; i < N; i++){ for (int j = 0; j < M; j++){ if (matchLineCnt[i][j] == X) total++; } } return total; }
int main () { int t, ca = 1, n; scanf("%d", &t); while(t--) { scanf("%d", &n); AC ac; for(int i = 0; i < n; ++i) { scanf("%s", a); ac.insert(a, 1); } ac.getFail(); scanf("%d", &n); memset(pro, 0, sizeof(pro)); for(int i = 0; i < n; ++i) { char c; double p; scanf("\n%c%lf", &c, &p); pro[ ac.idx(c) ] = p; } int l; scanf("%d", &l); for(int i = 0; i < maxnode; ++i) { for(int j = 0; j < 110; ++j) dp[i][j] = -1; } printf("Case #%d: %.6lf\n", ca++, solve(0, l, ac)); } return 0; }