Implemented by array
/* AC 自动机 多模式串匹配 HDU 2222 模板题 Fuck HDU, why always stick on input optimization?? Interestring? */ #include <cstdio> #include <cstring> #include <iostream> #include <queue> using namespace std; void gi(int &a) { char t = getchar(); a = 0; for (; !isdigit(t); t = getchar()) ; for (; isdigit(t); a *= 10, a += t - 48, t = getchar()) ; } void gs(string &s) { char t; s = ""; for (t = getchar(); !isprint(t); t = getchar()) ; for (; isprint(t); s += t, t = getchar()) ; } template <size_t alphabet_size = 26> struct Node { int ends; Node *child[alphabet_size], *fail; Node() { ends = 0; fail = NULL; memset(child, 0, sizeof(Node *) * alphabet_size); } void insert(const string &s) { auto c = this; int u; for (auto e : s) { u = e - 'a'; if (c->child[u] == NULL) { c->child[u] = new Node(); } c = c->child[u]; } c->ends++; } int search(const string &k) { int ans = 0, u; Node *p = this, *t; for (auto e : k) { u = e - 'a'; while (p->child[u] == NULL && p != this) { p = p->fail; } // match failed p = p->child[u]; if (p == NULL) { p = this; } // reach the end t = p; while (t != this && t->ends != -1) { ans += t->ends; // if next line is commented, find all occurrences, otherwise // only match once t->ends = -1; t = t->fail; } // all substrings } return ans; } void build_fail() { queue<Node *> q; q.push(this); Node *t, *p; while (!q.empty()) { t = q.front(); q.pop(); p = NULL; for (int i = 0; i < alphabet_size; i++) { if (t->child[i] != NULL) { // 'this' here must be root if (t == this) { t->child[i]->fail = this; } else { p = t->fail; while (p != NULL) { if (p->child[i] != NULL) { t->child[i]->fail = p->child[i]; break; } p = p->fail; } if (p == NULL) { t->child[i]->fail = this; } } q.push(t->child[i]); } } } } }; void exec() { Node<26> root; int n; gi(n); string s; while (n--) { gs(s); root.insert(s); } root.build_fail(); gs(s); cout << root.search(s) << endl; } int main() { int n = 1; // cin >> n; while (n--) { exec(); } return 0; }
本作品使用基于以下许可授权:Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.