2 条题解
-
0
无 nxt 数组版本:
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 5; struct Node { int fail, son[26]; bool flag, vis; } tr[maxn*10]; int idx; // 字典树插入 void ins(char s[]) { int u = 0; for (int i = 0; s[i]; i++) { int x = s[i] - 'a'; // 0<=x<=25 int &v = tr[u].son[x]; if (!v) v = ++idx; u = v; } tr[u].flag = true; } char s[maxn], t[101]; int q, ans; // 构造失败指针和nxt数组 void build() { queue<int> que; for (int i = 0; i < 26; i++) if (tr[0].son[i]) que.push(tr[0].son[i]); while (!que.empty()) { int u = que.front(), fail = tr[u].fail; // son[u][i] -- tr[u].son[i] que.pop(); for (int i = 0; i < 26; i++) { int &v = tr[u].son[i]; if (v) { tr[v].fail = tr[fail].son[i]; que.push(v); } else { v = tr[fail].son[i]; } } } } int main() { scanf("%s%d", s, &q); while (q--) { scanf("%s", t); ins(t); } build(); for (int u = 0, i = 0; s[i]; i++) { int x = s[i] - 'a'; // if (tr[u].son[x]) // u = tr[u].son[x]; // else // u = nxt[u][x]; u = tr[u].son[x]; for (int v = u; v && !tr[v].vis; v = tr[v].fail) { tr[v].vis = true; if (tr[v].flag) ans++; } } printf("%d\n", ans); return 0; } -
0
nxt数组版本:
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 5; struct Node { int fail, son[26]; bool flag, vis; } tr[maxn*10]; int idx, nxt[maxn*10][26]; // 字典树插入 void ins(char s[]) { int u = 0; for (int i = 0; s[i]; i++) { int x = s[i] - 'a'; // 0<=x<=25 int &v = tr[u].son[x]; if (!v) v = ++idx; u = v; } tr[u].flag = true; } char s[maxn], t[101]; int q, ans; // 构造失败指针和nxt数组 void build() { queue<int> que; for (int i = 0; i < 26; i++) if (tr[0].son[i]) que.push(tr[0].son[i]); while (!que.empty()) { int u = que.front(), fail = tr[u].fail; que.pop(); for (int i = 0; i < 26; i++) { if (tr[fail].son[i]) nxt[u][i] = tr[fail].son[i]; else nxt[u][i] = nxt[fail][i]; int v = tr[u].son[i]; if (v) { tr[v].fail = nxt[u][i]; que.push(v); } } } } int main() { scanf("%s%d", s, &q); while (q--) { scanf("%s", t); ins(t); } build(); for (int u = 0, i = 0; s[i]; i++) { int x = s[i] - 'a'; if (tr[u].son[x]) u = tr[u].son[x]; else u = nxt[u][x]; for (int v = u; v && !tr[v].vis; v = tr[v].fail) { tr[v].vis = true; if (tr[v].flag) ans++; } } printf("%d\n", ans); return 0; }
- 1
信息
- ID
- 81
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 17
- 已通过
- 2
- 上传者