제출 #668591

#제출 시각아이디문제언어결과실행 시간메모리
668591ShinSelling RNA Strands (JOI16_selling_rna)C++17
35 / 100
1592 ms40684 KiB
#include <bits/stdc++.h> #define fi first #define se second #define mp make_pair using namespace std; template <class X, class Y> bool minimize(X &a, Y b) { if (a > b) return a = b, true; return false; } template <class X, class Y> bool maximize(X &a, Y b) { if (a < b) return a = b, true; return false; } const char base[] = {'A', 'G', 'C', 'U'}; const int N = 2e6 + 7; int node[N][4]; int cnt[N]; int ind[26]; int f[N]; string p, q; pair<int, int> kew[N]; signed main() { cin.tie(0)->sync_with_stdio(0); auto add = [&](string &s) { static int num_node = 0; int cur = 0; for (int i = 0; i < (int) s.size(); i ++) { int c = ind[s[i] - 'A']; if (node[cur][c] == 0) { node[cur][c] = ++ num_node; } cur = node[cur][c]; } cnt[cur] ++; }; int res = 0; function<void(int, int)> bfs = [&](int u, int sz) { int l = 0, r = 0; kew[r ++] = mp(u, f[sz]); while (l < r) { auto [u, n_j] = kew[l ++]; if (n_j >= (int) q.size() - 1) { res += cnt[u]; } for (char c: base) if (node[u][ind[c - 'A']]) { int j = n_j; while (j > 0 && q[j] != c) { j = f[j - 1]; } if (q[j] == c) { j ++; } f[sz + 1] = j; kew[r ++] = mp(node[u][ind[c - 'A']], j); } } }; for (int i = 0; i < 4; i ++) { ind[base[i] - 'A'] = i; } int n, m; cin >> n >> m; for (int i = 1; i <= n; i ++) { string s; cin >> s; add(s); } while (m --) { cin >> p >> q; q += "#"; res = 0; int u = 0, found = true, sz = 0; for (int i = 1; i < (int) q.size(); i ++) { int j = f[sz]; while (j > 0 && q[j] != q[i]) { j = f[j - 1]; } if (q[j] == q[i]) { j ++; } f[++ sz] = j; } for (int i = 0; i < (int) p.size(); i ++) { if (node[u][ind[p[i] - 'A']] == 0) { found = false; break; } int j = f[sz]; while (j > 0 && q[j] != p[i]) { j = f[j - 1]; } if (q[j] == p[i]) { j ++; } f[++ sz] = j; u = node[u][ind[p[i] - 'A']]; } if (found) { bfs(u, sz); } cout << res << '\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...