Submission #1131567

#TimeUsernameProblemLanguageResultExecution timeMemory
1131567snowmelSelling RNA Strands (JOI16_selling_rna)C++20
35 / 100
275 ms31872 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int maxN = 1e5 + 10; int N, M; string A[maxN], P[maxN], Q[maxN]; namespace sub1 { bool check() { return N <= 100 && M <= 100; } void solve() { for(int i = 0; i < M; ++i) { int cnt = 0; for(int j = 0; j < N; ++j) { if(A[j].size() < P[i].size() || A[j].size() < Q[i].size()) continue; if(A[j].substr(0, P[i].size()) == P[i] && A[j].substr(A[j].size() - Q[i].size(), A[j].size()) == Q[i]) ++cnt; } cout << cnt << "\n"; } } }; namespace sub2 { const ll base1 = 257; const ll base2 = 263; const ll MOD = 1e9 + 7; bool check() { return N <= 5000 && M <= 5000; } ll qpow(ll x, ll k) { ll res = 0; while(k) { if(k & 1) res = res * x % MOD; x = x * x % MOD; k >>= 1; } return res; } void solve() { vector<vector<ll>> _h(N); int mx_sz = 0; for(int i = 0; i < N; ++i) { if(A[i].size() > mx_sz) mx_sz = A[i].size(); _h[i].resize(A[i].size()); for(int j = 0; j < A[i].size(); ++j) _h[i][j] = ((j ? _h[i][j - 1] : 0ll) * base1 + A[i][j]) % MOD; //for(int j = 0; j < A[i].size(); ++j) cout << _h[i][j] << " "; cout << "\n"; } vector<ll> pw(mx_sz); pw[0] = 1; pw[1] = base1; for(int i = 2; i < pw.size(); ++i) pw[i] = pw[i - 1] * pw[1] % MOD; for(int i = 0; i < M; ++i) { ll res = 0; ll valP = 0, valQ = 0; for(int j = 0; j < P[i].size(); ++j) valP = (valP * base1 + P[i][j]) % MOD; for(int j = 0; j < Q[i].size(); ++j) valQ = (valQ * base1 + Q[i][j]) % MOD; //cout << valP << " " << valQ << "\n"; for(int j = 0; j < N; ++j) { if(P[i].size() > A[j].size() || Q[i].size() > A[j].size()) continue; if(valP == _h[j][P[i].size() - 1] && ((Q[i].size() == A[j].size() && valQ == _h[j].back()) || (_h[j].back() - (_h[j][A[j].size() - Q[i].size() - 1]) * pw[Q[i].size()] % MOD + MOD) % MOD == valQ)) ++res; } cout << res << "\n"; } } void solve1() { } }; void solve() { cin >> N >> M; for(int i = 0; i < N; ++i) cin >> A[i]; for(int i = 0; i < M; ++i) cin >> P[i] >> Q[i]; //if(sub1::check()) return sub1::solve(); if(sub2::check()) return sub2::solve(); assert(false); } // T - S(i) = j // T - S(j) = i // S(j) - S(i) = j - i // <=> S(j) - j = S(i) - i int main() { ios_base::sync_with_stdio(0); cin.tie(0); int t = 1; //cin >> t; while(t--) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...