#include<bits/stdc++.h> usingnamespace std; char s[3000010]; int a[3000010][90]; int idx;//节点编号 int cnt[3000010]; voidinsert(char s[]){ int p = 0, c; for (int i = 0; s[i]; i++) { c = s[i] - '0'; if (a[p][c] == 0) a[p][c] = ++idx; p = a[p][c]; cnt[p]++; }
} intquery(char s[]){ int d = 0, c; for (int i = 0; s[i]; i++) { c = s[i] - '0';//恶心题,字符串包含数字 if (a[d][c] == 0) return0; else d = a[d][c]; } return cnt[d]; } intmain(){ int t; cin >> t; while (t--) { for (int i = 0; i <= idx; i++) { for (int j = 0; j < 90; j++) { a[i][j] = 0; } }
for (int i = 0; i <= idx; i++) { cnt[i] = 0; } idx = 0; int n; cin >> n;
int m; cin >> m; for (int i = 1; i <= n; i++) { cin >> s; insert(s); }
for (int i = 1; i <= m; i++) { cin >> s; cout << query(s) << "\n"; } } }
#include<bits/stdc++.h> usingnamespace std; int n, ch[1000010][30], cnt[1000010]; char s[1000010]; int idx; voidinsert(){ int p = 0; for (int i = 0; s[i]; i++) { int x = s[i] - 'a'; if (ch[p][x] == 0) ch[p][x] = ++idx; p = ch[p][x];//下移到当前节点(下一次起点) } cnt[p]++;//节点编号++ } intquery(){ int x, p = 0; for (int i = 0; s[i]; i++) { x = s[i] - 'a'; if (ch[p][x] == 0) return0; p = ch[p][x]; } return cnt[p]; } intmain(){ scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%s", s); insert(); } cin >> n; for (int i = 1; i <= n; i++) { scanf("%s", s); printf("%d\n", query()); }