1 条题解
-
1
namespace Fusu { const int maxt = 26; const int maxn = 2000005; void Init(); void Build(); void Solve(); void Main() { Init(); Build(); Solve(); } int n, q; int len[maxn]; char s[maxn]; struct Node { bool isend; unsigned mch, depth; Node *fail; Node *trans[maxt]; Node() : isend(false), mch(0), depth(0), fail(nullptr) { memset(trans, 0, sizeof trans); } void calc() { mch = fail->mch; if (isend) mch |= 1u << depth; } }; Node *rot; void Init() { scanf("%d%d", &n, &q); rot = new Node; for (int i = 1; i <= n; ++i) { scanf("%s", s + 1); len[i] = strlen(s + 1); auto u = rot; for (int j = 1, x = s[j] - 'a'; j <= len[i]; x = s[++j] - 'a') { u = u->trans[x] ? u->trans[x] : (u->trans[x] = new Node()); } u->isend = true; } } std::queue<Node*> Q; void Build() { for (auto &u : rot->trans) if (u != nullptr) { u->fail = rot; u->depth = 1; Q.push(u); } else { u = rot; } for (Node *u, *v; !Q.empty(); Q.pop()) { u = Q.front(); u->calc(); for (int i = 0; i < maxt; ++i) if ((v = u->trans[i]) != nullptr) { v->depth = u->depth + 1; v->fail = u->fail->trans[i]; Q.push(v); } else { u->trans[i] = u->fail->trans[i]; } } } void Solve() { while (q--) { int ans = 0; unsigned tmp = 1; scanf("%s", s + 1); int m = strlen(s + 1); auto u = rot; for (int i = 1, x = s[i] - 'a'; i <= m; x = s[++i] - 'a') { if (((u = u->trans[x])->mch) & (tmp <<= 1)) { tmp |= 1; ans = i; } } qw(ans, '\n'); } } }
- 1
信息
- ID
- 1212
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- (无)
- 递交数
- 27
- 已通过
- 15
- 上传者