Submission #767334

#TimeUsernameProblemLanguageResultExecution timeMemory
767334jmyszka2007Selling RNA Strands (JOI16_selling_rna)C++17
100 / 100
281 ms283584 KiB
#include <bits/stdc++.h> using namespace std; #define st first #define nd second #define pi pair<int, int> #define pb push_back constexpr int LIM = 4e6; constexpr int base = (1 << 22); int gpref[LIM + 10][26]; int gsuf[LIM + 10][26]; int prepref[LIM + 10]; int sizpref[LIM + 10]; int presuf[LIM + 10]; int sizsuf[LIM + 10]; int res[LIM + 10]; int tri[2 * base]; void upd(int v) { v += base; while(v > 0) { tri[v]++; v /= 2; } } int que(int l, int r) { l += base; r += base; int ans = 0; while(l <= r) { if(l & 1) { ans += tri[l]; } if(!(r & 1)) { ans += tri[r]; } l = (l + 1) / 2; r = (r - 1) / 2; } return ans; } int aktpre = 1; void dfspref(int v) { prepref[v] = aktpre++; sizpref[v] = 1; for(int i = 0; i < 26; i++) { if(gpref[v][i]) { dfspref(gpref[v][i]); sizpref[v] += sizpref[gpref[v][i]]; } } } void dfssuf(int v) { presuf[v] = aktpre++; sizsuf[v] = 1; for(int i = 0; i < 26; i++) { if(gsuf[v][i]) { dfssuf(gsuf[v][i]); sizsuf[v] += sizsuf[gsuf[v][i]]; } } } int main() { //ios_base::sync_with_stdio(0); //cin.tie(0); int n, t; cin >> n >> t; int cntpref = 2; int cntsuf = 2; vector<pair<pi, pi> >zap; for(int i = 1; i <= n; i++) { string a; cin >> a; pi pkt; int akt = 1; for(auto x : a) { if(!gpref[akt][x - 'A']) { gpref[akt][x - 'A'] = cntpref++; } akt = gpref[akt][x - 'A']; } pkt.st = akt; reverse(a.begin(), a.end()); akt = 1; for(auto x : a) { if(!gsuf[akt][x - 'A']) { gsuf[akt][x - 'A'] = cntsuf++; } akt = gsuf[akt][x - 'A']; } pkt.nd = akt; zap.pb({pkt, {0, 0}}); } for(int i = 1; i <= t; i++) { string a, b; cin >> a >> b; reverse(b.begin(), b.end()); pi pkt; int akt = 1; for(auto x : a) { if(!gpref[akt][x - 'A']) { gpref[akt][x - 'A'] = cntpref++; } akt = gpref[akt][x - 'A']; } pkt.st = akt; akt = 1; for(auto x : b) { if(!gsuf[akt][x - 'A']) { gsuf[akt][x - 'A'] = cntsuf++; } akt = gsuf[akt][x - 'A']; } pkt.nd = akt; zap.pb({pkt, {0, i}}); } dfspref(1); aktpre = 1; dfssuf(1); vector<pair<pi, pi> >nzap; /*for(int i = 1; i < cntpref; i++) { cout << i << ' ' << prepref[i] << ' ' << sizpref[i] << ":\n"; for(int j = 0; j < 26; j++) { if(gpref[i][j]) { cout << gpref[i][j] << ' '; } } cout << '\n'; }*/ for(int i = 0; i < zap.size(); i++) { int a = prepref[zap[i].st.st]; int b = presuf[zap[i].st.nd]; //cout << a << ' ' << b << '\n'; if(!zap[i].nd.nd) { nzap.pb({{a, 0}, {0, b}}); } else { nzap.pb({{a - 1, b}, {b + sizsuf[zap[i].st.nd] - 1, -zap[i].nd.nd}}); nzap.pb({{a + sizpref[zap[i].st.st] - 1, b}, {b + sizsuf[zap[i].st.nd] - 1, zap[i].nd.nd}}); } } sort(nzap.begin(), nzap.end()); for(auto x : nzap) { //cout << x.st.st << ' ' << x.st.nd << ' ' << x.nd.st << ' ' << x.nd.nd << '\n'; if(!x.st.nd) { upd(x.nd.nd); } else { if(x.nd.nd < 0) { res[-x.nd.nd] -= que(x.st.nd, x.nd.st); } else { res[x.nd.nd] += que(x.st.nd, x.nd.st); } } } for(int i = 1; i <= t; i++) { cout << res[i] << '\n'; } }

Compilation message (stderr)

selling_rna.cpp: In function 'int main()':
selling_rna.cpp:128:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<std::pair<int, int>, std::pair<int, int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  128 |  for(int i = 0; i < zap.size(); 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...