제출 #319666

#제출 시각아이디문제언어결과실행 시간메모리
319666qpwoeirutSelling RNA Strands (JOI16_selling_rna)C++17
35 / 100
1594 ms153452 KiB
#include <bits/stdc++.h> using namespace std; #define sz(x) (int)((x).size()) typedef long long ll; const int MN = 100001; const int CT = 2; const ll MOD[CT] = {(ll)1e9 + 7, (ll)1e9+9}; const ll BASE = 11; int to_int[128]; struct Hash { int h[CT]; Hash() { fill(h, h+CT, 0); } Hash(string s) { fill(h, h+CT, 0); for (int i=sz(s) - 1; i>=0; --i) { for (int j=0; j<CT; ++j) { h[j] = ((h[j] * BASE) + to_int[s[i]]) % MOD[j]; } } } void add(char c) { for (int i=0; i<CT; ++i) { h[i] = ((h[i] * BASE) + to_int[c]) % MOD[i]; } } inline const bool operator<(const Hash& other) const { for (int i=0; i<CT; ++i) { if (h[i] != other.h[i]) { return h[i] < other.h[i]; } } return false; } inline const bool operator==(const Hash& other) const { for (int i=0; i<CT; ++i) { if (h[i] != other.h[i]) return false; } return true; } }; struct Str { string s; vector<Hash> h; Str() { s = ""; h = vector<Hash>(); } Str(const string& str) { s = str; h = vector<Hash>(sz(s)); Hash cur; for (int i=0; i<sz(s); ++i) { cur.add(s[i]); h[i] = cur; } } int size() { return s.size(); } inline const bool operator<(const Str& other) { int mn = min(sz(s), sz(other.s)); int lo = 0, hi = mn; while (lo < hi) { int mid = (lo + hi) >> 1; if (h[mid] == other.h[mid]) { lo = mid + 1; } else { hi = mid; } } if (lo == mn) { return sz(s) < sz(other.s); } return s[lo] < other.s[lo]; } }; int N, M; Str S[MN]; vector<Hash> phash[MN]; map<Hash, vector<int>> shash; int main() { cin.tie(0)->sync_with_stdio(0); to_int['A'] = 1; to_int['B'] = 2; to_int['C'] = 3; to_int['D'] = 4; to_int['G'] = 5; to_int['H'] = 6; to_int['U'] = 7; to_int['V'] = 8; cin >> N >> M; for (int i=0; i<N; ++i) { string s; cin >> s; S[i] = Str(s); } sort(S, S+N); for (int i=0; i<N; ++i) { Hash cur; for (int j=sz(S[i]) - 1; j>=0; --j) { cur.add(S[i].s[j]); shash[cur].emplace_back(i); } } for (int i=0; i<M; ++i) { string P, Q; cin >> P >> Q; int lo = lower_bound(S, S+N, P) - S; P.back()++; int hi = lower_bound(S, S+N, P) - S; Hash suff(Q); auto it = shash.find(suff); if (it == shash.end()) { cout << "0\n"; } else { int mn = lower_bound(it->second.begin(), it->second.end(), lo) - it->second.begin(); int mx = lower_bound(it->second.begin(), it->second.end(), hi) - it->second.begin(); cout << mx - mn << '\n'; } } } /* 2 3 AUGC AGC G C AU C A C 3 3 AA AA AGA AA AA AG GA AG GA 8 7 GCGCUACCCCAACACAAGGCAAGAUAUA G GGAC GCGG U GCGCUACCCCAACACAAGGCAAGAUGGUC GCCG GCGCUGA GCGCUACCC A GCGCUACCCC AC GCG C GCGC A G G G C G GGA */

컴파일 시 표준 에러 (stderr) 메시지

selling_rna.cpp: In constructor 'Hash::Hash(std::string)':
selling_rna.cpp:26:52: warning: array subscript has type 'char' [-Wchar-subscripts]
   26 |                 h[j] = ((h[j] * BASE) + to_int[s[i]]) % MOD[j];
      |                                                    ^
selling_rna.cpp: In member function 'void Hash::add(char)':
selling_rna.cpp:32:44: warning: array subscript has type 'char' [-Wchar-subscripts]
   32 |             h[i] = ((h[i] * BASE) + to_int[c]) % MOD[i];
      |                                            ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...