1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| #include<bits/stdc++.h> using namespace std; #define endl '\n' #define FL(a,b,c) for(int a=(b),a##end=(c);a<=a##end;++a) #define FR(a,b,c) for(int a=(b),a##end=(c);a>=a##end;--a) #define lowbit(x) ((x)&-(x)) #define eb emplace_back #define SZ(x) (int)((x).size()) #define ll long long #define vt vector #define ar(x) array<int,x> #define PII pair<int, int> #define max(a, b)({auto f7r=(a);auto j3h=(b);f7r<j3h?j3h:f7r;}) #define cmax(a, b)({auto j3h=(b);(j3h>a)&&(a=j3h);}) #define min(a, b)({auto f7r=(a);auto j3h=(b);f7r>j3h?j3h:f7r;}) #define cmin(a, b)({auto j3h=(b);(j3h<a)&&(a=j3h);}) constexpr int N = 2e6 + 10; struct node{ int fail, end, son[27], ans; void clear(){fail = end = ans = 0, memset(son, 0, sizeof son);} }AC[N]; char a[N]; int tot, Map[N], ans[N]; void insert(char*a, int num){ int u = 0; FL(i, 1, strlen(a + 1)){ int &z = AC[u].son[a[i] - 'a']; if(!z)z = ++tot, AC[tot].clear(); u = z; } if(!AC[u].end)AC[u].end = num; Map[num] = AC[u].end; } void get_fail(){ queue<int>q; FL(i, 0, 25)if(AC[0].son[i])q.push(AC[0].son[i]); while(!q.empty()){ int u = q.front(), fail = AC[u].fail, *z; q.pop(); FL(i, 0, 25) if(!(z = &AC[u].son[i], *z))*z = AC[fail].son[i]; else AC[*z].fail = AC[fail].son[i], q.push(*z), in[AC[*z].fail]++; } } void query(char*a){ int u = 0; FL(i, 1, strlen(a + 1)) u = AC[u].son[a[i] - 'a'], AC[u].ans++; } void bfs(){ queue<int>q; FL(i, 1, tot)if(!in[i])q.push(i); while(!q.empty()){ int u = q.front(), v; q.pop(), ans[AC[u].end] = AC[u].ans; AC[v = AC[u].fail].ans += AC[u].ans; if(!--in[v])q.push(v); } } int32_t main(){ cin.tie(0)->sync_with_stdio(0); int n; cin >> n; FL(i, 1, n)cin >> a + 1, insert(a, i); get_fail(), cin >> a + 1, query(a), bfs(); FL(i, 1, n)cout << ans[Map[i]] << endl; return 0; }
|