#include <iostream> using namespace std; const int N = 10000; const int M = 26; const int fail = M+1; const int root = 0; const char ch = 'a'; int trie[N*50][M+2], lt; int que[N*50], lq; void init(const int &t) { memset(trie[t], 0, sizeof(trie[t])); } void insert(char* s) { int i, k=root, t; for(i=0; s[i]; ++i) { t = s[i] - ch; if( 0 == trie[k][t] ) { init(lt); trie[k][t] = lt++; } k = trie[k][t]; } ++trie[k][M]; } void AC_automation() { que[0] = root, lq = 1, trie[root][fail] = root; int i, j, k, t; for(i=0; i<lq; ++i) { k = que[i]; for(j=0; j<M; ++j) if( trie[k][j] ) { if( root == k ) trie[ trie[k][j] ][fail] = root; else { t = trie[k][fail]; while( t && 0==trie[t][j] ) t = trie[t][fail]; trie[ trie[k][j] ][fail] = trie[t][j]; } que[lq++] = trie[k][j]; } } } int get_ans(char* s) { int i, j, k=root, t, ans = 0; for(i=0; s[i]; ++i) { t = s[i] - ch; while(0 == trie[k][t] && k ) k = trie[k][fail]; k = trie[k][t]; j = k; while( j && trie[j][M] != -1) { ans += trie[j][M]; trie[j][M] = -1; j = trie[j][fail]; } } return ans; } char str[N*101]; int main() { int Case, i, n; scanf("%d", &Case); while(Case--) { scanf("%d", &n); init(0); lt = 1; for(i=0; i<n; ++i) { scanf("%s", str); insert(str); } AC_automation(); scanf("%s", str); printf("%d/n", get_ans(str)); } return 0; }