1 条题解
-
0
#include <bits/stdc++.h> using namespace std; const int N = 2e6 + 10; char s[N]; int ch[N][26], id, pre[N], sum[N], ys[N]; void ins(char *s, int x) { int p = 0; for (int i = 0; s[i]; i++) { int j = s[i] - 'a'; if (ch[p][j] == 0) ch[p][j] = ++id; p = ch[p][j]; } ys[x] = p; } void build() { queue<int> Q; for (int i = 0; i < 26; i++) if (ch[0][i]) Q.push(ch[0][i]); while (Q.size()) { int x = Q.front(); Q.pop(); for (int i = 0; i < 26; i++) { int y = ch[x][i]; if (y == 0) ch[x][i] = ch[pre[x]][i]; else pre[y] = ch[pre[x]][i]; Q.push(y); } } } void query(char *s) { int p = 0; for (int i = 0; s[i]; i++) { p = ch[p][s[i] - 'a']; sum[p]++; } } vector<int> G[N]; void dfs(int x) { for (int y : G[x]) { dfs(y); sum[x] += sum[y]; } } int main() { int n; scanf("%d", &n); id = 0; memset(ch, 0, sizeof(ch)); for (int i = 1; i <= n; i++) { scanf("%s", s); ins(s, i); } memset(pre, 0, sizeof(pre)); build(); scanf("%s", s); memset(sum, 0, sizeof sum); query(s); for (int i = 1; i <= id; i++) G[pre[i]].push_back(i); dfs(0); for (int i = 1; i <= n; i++) printf("%d\n", sum[ys[i]]); return 0; }
- 1
信息
- ID
- 504
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 8
- 标签
- 递交数
- 169
- 已通过
- 27
- 上传者