Submission #1282448

#TimeUsernameProblemLanguageResultExecution timeMemory
1282448KickingKunSelling RNA Strands (JOI16_selling_rna)C++20
100 / 100
179 ms188440 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define ld long double #define emb emplace_back #define pii pair <int, int> #define fi first #define se second #define testBit(n, k) ((n >> k) & 1) #define flipBit(n, k) (n ^ (1ll << k)) #define Task "rna" template <class T> bool minimize(T &a, T b) { if (a > b) return a = b, true; return false; } template <class T> bool maximize(T &a, T b) { if (a < b) return a = b, true; return false; } const int N = 1e5 + 5, mod = 1e9 + 321, base = 311; const ll INF = 1e18; const int root = 0; int cntNode = 0; struct Node { int child[4], cnt; Node () { memset(child, -1, sizeof child); cnt = 0; } } node[N * 20 * 4]; void add(string &str) { int p = root; for (char c: str) { int k = c - 'A'; if (node[p].child[c] == -1) node[p].child[c] = ++cntNode; p = node[p].child[c]; ++node[p].cnt; } } int get(string &str) { int p = root; for (char c: str) { int k = c - 'A'; if (node[p].child[c] == -1) return 0; p = node[p].child[c]; } return node[p].cnt; } int n, m; string s[N], r[N]; string p[N], q[N]; vector <tuple <string, int, int>> query[N]; string decode(string str) { for (char &c: str) { if (c == 'C') c = 'B'; else if (c == 'G') c = 'C'; else if (c == 'U') c = 'D'; } return str; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); if (fopen(Task".inp", "r")) { freopen(Task".inp", "r", stdin); freopen(Task".out", "w", stdout); } cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> s[i]; s[i] = decode(s[i]); } sort (s + 1, s + n + 1); for (int i = 1; i <= n; i++) { r[i] = s[i]; reverse(r[i].begin(), r[i].end()); } int outID = n + 1; for (int i = 0; i < m; i++) { cin >> p[i] >> q[i]; p[i] = decode(p[i]); q[i] = decode(q[i]); reverse(q[i].begin(), q[i].end()); int L = lower_bound(s + 1, s + n + 1, p[i]) - s; int R = upper_bound(s + L, s + n + 1, p[i] + 'z') - s - 1; if (L <= R) { query[L - 1].emb(q[i], i, -1); query[R].emb(q[i], i, 1); } // cerr << L << ' ' << R << '\n'; } vector <int> ans(m); for (int i = 1; i <= n; i++) { add(r[i]); for (int _ = 0; _ < query[i].size(); _++) { string &q = get<0>(query[i][_]); int id = get<1>(query[i][_]), b = get<2>(query[i][_]); ans[id] += b * get(q); } } for (int x: ans) cout << x << '\n'; }

Compilation message (stderr)

selling_rna.cpp: In function 'int main()':
selling_rna.cpp:78:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   78 |                 freopen(Task".inp", "r", stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
selling_rna.cpp:79:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   79 |                 freopen(Task".out", "w", stdout);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...