萌新刚学 OI,求帮忙卡空间

P2322 [HNOI2006] 最短母串问题

```cpp #include <bits/stdc++.h> #define lowb(a, r, x) lower_bound(a + 1, a + r + 1, x) - a #define uppb(a, r, x) upper_bound(a + 1, a + r + 1, x) - a #define _for(i, a, b) for (ll i = a; i <= b; ++i) #define for_(i, a, b) for (ll i = a; i >= b; --i) #define far(i, vec) for (auto i : vec) #define bdmd int mid = (l + r) >> 1 #define NO nullptr typedef long double ldb; typedef long long ll; typedef double db; const int N = 610, M = 1 << 12; namespace ACAUTOMATON { class ACAutomaton { private: int cnt = 0, nxt[N][26], fail[N], end[N]; int t = 0, vis[N][M], la[N][M], ch[N][M], lst[N][M]; public: inline void Insert (char* s, int id) { int p = 0, len = strlen (s + 1); // puts (s + 1); _for (i, 1, len) { int c = s[i] - 'A'; if (!nxt[p][c]) nxt[p][c] = ++cnt; p = nxt[p][c]; // printf ("%d ", p); } // puts (""); end[p] |= 1 << (id - 1); return; } inline void Build () { std::queue <int> q; _for (i, 0, 25) if (nxt[0][i]) fail[nxt[0][i]] = 0, q.push (nxt[0][i]); while (!q.empty ()) { int u = q.front (); q.pop (); _for (i, 0, 25) { if (nxt[u][i]) fail[nxt[u][i]] = nxt[fail[u]][i], end[nxt[u][i]] |= end[u], q.push (nxt[u][i]); else nxt[u][i] = nxt[fail[u]][i]; } } // _for (i, 1, cnt) printf ("%lld %lld\n", i, end[i]); // puts (""); // printf ("!!:%lld\n", nxt[4]['P' - 'A']); return; } inline int BFS (int num, int ST) { memset (vis, 0x3f, sizeof (vis)); std::queue <std::pair <int, int> > q; q.push (std::make_pair (0, 0)), vis[0][0] = 0; while (!q.empty ()) { int u = q.front ().first, st = q.front ().second; q.pop (); // printf ("%lld %lld %lld %lld %lld %lld\n", u, st, vis[u][st], la[u][st], ch[u][st], lst[u][st]); if (st == ST) return u; _for (i, 0, 25) { int v = nxt[u][i]; int sta = st | end[v]; if (vis[u][st] + 1 >= vis[v][sta]) continue; vis[v][sta] = vis[u][st] + 1; la[v][sta] = u, ch[v][sta] = i, lst[v][sta] = st; q.push (std::make_pair (v, sta)); // printf ("%lld %lld %lld\n", v, sta, i); } } return 0; } inline void Print (int p, int sta) { if (!p) return; Print (la[p][sta], lst[p][sta]); putchar (ch[p][sta] + 'A'); return; } }; } namespace SOLVE { int n, m, t, ans, c[15]; char s[15][60]; ACAUTOMATON::ACAutomaton ac; inline int rnt () { int x = 0, w = 1; char c = getchar (); while (!isdigit (c)) { if (c == '-') w = -1; c = getchar (); } while (isdigit (c)) x = (x << 3) + (x << 1) + (c ^ 48), c = getchar (); return x * w; } inline bool Compare (char *s1, char *s2) { int l1 = strlen (s1 + 1), l2 = strlen (s2 + 1); _for (i, 1, l2) { int flag = 0; _for (j, 1, l1) { if (s2[i + j - 1] != s1[j]){ flag = 1; break; } } if (!flag) return 1; } return 0; } inline void In () { n = rnt (); _for (i, 1, n) scanf ("%s", s[i] + 1); _for (i, 1, n) { _for (j, 1, n) { if (i == j) continue; if (strlen (s[i] + 1) >= strlen (s[j] + 1)) continue; c[i] = Compare (s[i], s[j]); } } _for (i, 1, n) { if (c[i]) continue; t |= 1 << (i - 1), ac.Insert (s[i], i); } return; } inline void Solve () { ac.Build (); ans = ac.BFS (n, t); return; } inline void Out () { ac.Print (ans, t); puts (""); return; } } int main () { #ifndef ONLINE_JUDGE freopen ("date.in", "r", stdin); #endif SOLVE::In (); SOLVE::Solve (); SOLVE::Out (); return 0; } /* */ ```
by K8He @ 2023-04-23 19:01:52


[不 MLE 了,现在 WA 了](https://www.luogu.com.cn/record/108782167)
by K8He @ 2023-04-23 19:21:58


@[Keven_He](/user/306045) ``` end[nxt[u][i]] |= end[fail[nxt[u][i]]] ```
by Delov @ 2023-04-23 20:16:50


@[Keven_He](/user/306045) 状态是继承失配树上的
by Delov @ 2023-04-23 20:18:04


@[Delov](/user/277792) 谢谢您!已经过了! 事实上去重的部分也有问题,应该是:`c[i] |= Compare (s[i], s[j]);`。
by K8He @ 2023-04-23 20:28:59


|