#include <cstdio> #include <cstring> #define max(x, y) ((x) > (y) ? (x) : (y)) int p, k, w, n, m, num; char s[2001], a[7][2001]; int f[2001][41], len[7], d[2001]; bool flag; int main() { scanf("%d %d", &p, &m); for(int i = 1; i <= p; i++) scanf("%s", s + 20 * (i - 1) + 1); n = strlen(s + 1); scanf("%d", &num); for(int i = 1; i <= num; i++) { scanf("%s", a[i] + 1); len[i] = strlen(a[i] + 1); } memset(d, 127 / 3, sizeof(d)); for(int i = 1; i <= n; i++) for(int j = 1; j <= num; j++) { if(i + len[j] - 1 > n || d[i] <= i + len[j] - 1) continue; flag = 0; for(int k = 1; k <= len[j]; k++) if(s[i + k - 1] != a[j][k]) { flag = 1; break; } if(!flag) d[i] = i + len[j] - 1; } for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) { w = 0; for(int k = i; k >= j; k--) { if(d[k] <= i) w++; f[i][j] = max(f[i][j], f[k - 1][j - 1] + w); } } printf("%d", f[n][m]); return 0; }