제출 #521519

#제출 시각아이디문제언어결과실행 시간메모리
521519tengiz05Selling RNA Strands (JOI16_selling_rna)C++17
35 / 100
1581 ms87748 KiB
#include <bits/stdc++.h> using i64 = long long; constexpr i64 P = 1E9 + 7, M = 5; int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int n, m; std::cin >> n >> m; std::vector<std::string> s(n); for (int i = 0; i < n; i++) { std::cin >> s[i]; } std::sort(s.begin(), s.end()); std::vector<std::tuple<int, int, int>> Q; for (int i = 0; i < m; i++) { std::string p, q; std::cin >> p >> q; int l = std::lower_bound(s.begin(), s.end(), p) - s.begin(); int r = std::upper_bound(s.begin(), s.end(), p + 'Z') - s.begin(); i64 H = 0; for (char c : q) { H *= M; H += std::string("AGCU").find(c) + 1; H %= P; } Q.emplace_back(l, -H, i); Q.emplace_back(r, H, i); } std::sort(Q.begin(), Q.end()); std::vector<int> ans(m); std::map<int, int> cnt; int j = 0; for (int i = 0; i < n; i++) { int p, H, id; while (j < int(Q.size())) { std::tie(p, H, id) = Q[j]; if (p != i) { break; } if (H < 0) { ans[id] -= cnt[-H]; } else { ans[id] += cnt[H]; } j++; } i64 h = 0, pw = 1; for (int j = int(s[i].size()) - 1; j >= 0; j--) { h = (h + pw * (std::string("AGCU").find(s[i][j]) + 1)) % P; pw *= M; cnt[h]++; } } while (j < int(Q.size())) { int p, H, id; std::tie(p, H, id) = Q[j]; if (H < 0) { ans[id] -= cnt[-H]; } else { ans[id] += cnt[H]; } j++; } for (int i = 0; i < m; i++) { std::cout << ans[i] << "\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...