Submission #1306518

#TimeUsernameProblemLanguageResultExecution timeMemory
1306518pvproViruses (BOI20_viruses)C++20
0 / 100
25 ms1632 KiB
#ifndef LOCAL #pragma GCC Optimize("O3,Ofast,unroll-loops") #pragma GCC Target("bmi,bmi2,avx,avx2") #endif #include <bits/stdc++.h> using namespace std; using ll = long long; using ld = long double; using ull = unsigned ll; #define int ull #define f first #define s second #define mp make_pair #define pb push_back #define pii pair<int, int> #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin() (x).rend() #ifndef LOCAL #define endl "\n" #endif mt19937 rnd(11); const int K = 2; const int MAXV = 1010; int nextt[MAXV][K], go1[MAXV][K]; int suflink[MAXV], par[MAXV], lch[MAXV]; vector<int> last1[MAXV]; int S = 1; void add_word(string s, int ind) { int cur = 0; for (int i = 0; i < (int) s.size(); i++) { if (nextt[cur][s[i] - '0'] == -1) { int nw = S; par[nw] = cur; lch[nw] = s[i] - '0'; for (int j = 0; j < K; j++) { nextt[nw][j] = -1; go1[nw][j] = -1; } suflink[nw] = -1;; S++; nextt[cur][s[i] - '0'] = nw; } cur = nextt[cur][s[i] - '0']; } last1[cur].push_back(ind); } int go(int v, int c); int link(int v) { if (suflink[v] == -1) { if (v == 0 || par[v] == 0) { suflink[v] = 0; } else { suflink[v] = go(link(par[v]), lch[v]); } } return suflink[v]; } int go(int v, int c) { if (go1[v][c] == -1) { if (nextt[v][c] != -1) { go1[v][c] = nextt[v][c]; } else if (v == 0) { go1[v][c] = 0; } else { go1[v][c] = go(link(v), c); } } return go1[v][c]; } void build(vector<string> s) { for (int i = 0; i < K; i++) { nextt[0][i] = -1; go1[0][i] = -1; } suflink[0] = -1; par[0] = -1; lch[0] = -1; for (int i = 0; i < (int) s.size(); i++) add_word(s[i], i); stack<int> st; st.push(0); while (!st.empty()) { int cur = st.top(); st.pop(); link(cur); for (int i = 0; i < K; i++) { go(cur, i); if (nextt[cur][i] != -1) { st.push(nextt[cur][i]); } } } } void solve() { int g, n, m; cin >> g >> n >> m; vector<vector<vector<int>>> a(g); for (int i = 0; i < n; ++i) { int f, sz; cin >> f >> sz; a[f].pb(vector<int>(sz)); for (auto &x : a[f].back()) { cin >> x; } } vector<string> s(m); for (auto &x : s) { int sz; cin >> sz; for (int i = 0; i < sz; ++i) { char c; cin >> c; x += c; } } build(s); vector<vector<vector<int>>> dp(g, vector<vector<int>>(S, vector<int>(S, (1ll<<63)))); for (int i = 0; i < S; ++i) { if (last1[i].empty()) { if (last1[go1[i][0]].empty()) { dp[0][i][go1[i][0]] = 1; } if (last1[go1[i][1]].empty()) { dp[1][i][go1[i][1]] = 1; } } } bool run = true; while (run) { run = false; for (int num = 2; num < g; ++num) { for (int f = 0; f < S; ++f) { if (last1[f].empty()) { for (auto &v : a[num]) { vector<int> now(S, (1ll<<63)); now[f] = 0; for (auto &x : v) { vector<int> now2(S, (1ll<<63)); for (int tnow = 0; tnow < S; ++tnow) { if (last1[tnow].empty()) { for (int fnow = 0; fnow < S; ++fnow) { now2[tnow] = min(now2[tnow], now[fnow] + dp[x][fnow][tnow]); } } } now = now2; } for (int t = 0; t < S; ++t) { if (dp[num][f][t] > now[t]) { run = true; dp[num][f][t] = now[t]; } } } } } } } for (int num = 2; num < g; ++num) { int ans = (1ll<<63); for (int t = 0; t < S; ++t) { ans = min(ans, dp[num][0][t]); } if (ans == (1ll<<63)) { cout << "YES" << endl; } else { cout << "NO " << ans << endl; } } } signed main() { #ifdef LOCAL freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #else ios::sync_with_stdio(false); cin.tie(0); #endif int t = 1; // cin >> t; while (t--) { solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...