제출 #291945

#제출 시각아이디문제언어결과실행 시간메모리
291945eggag32Selling RNA Strands (JOI16_selling_rna)C++17
35 / 100
1600 ms159272 KiB
#pragma GCC optimize ("O3") #pragma GCC target ("sse4") #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; typedef vector<int> vi; typedef pair<int, int> pi; #define debug(x) cerr << #x << ": " << x << endl #define debug2(x, y) debug(x), debug(y) #define repn(i, a, b) for(int i = (int)(a); i < (int)(b); i++) #define rep(i, a) for(int i = 0; i < (int)(a); i++) #define all(v) v.begin(), v.end() #define mp make_pair #define pb push_back #define lb lower_bound #define ub upper_bound #define fi first #define se second #define sq(x) ((x) * (x)) const int mxN = 1e5 + 5; const int MOD = 1e9 + 7; template<class T> T gcd(T a, T b){ return ((b == 0) ? a : gcd(b, a % b)); } struct HASH{ size_t operator () (const pair<int, int> &x) const { return hash<long long>()(((long long)(x.first)) ^ (((long long)(x.second)) << 32)); } }; int n, m; string s[mxN]; pair<pair<string, string>, int> p[mxN]; unordered_map<ll, int> hshs; vector<ll> haS[mxN]; vector<ll> haS1[mxN]; vector<ll> haP[mxN]; ll h[mxN]; bool cmp(pair<pair<string, string>, int> a, pair<pair<string, string>, int> b){ return a.fi.fi < b.fi.fi; } void add(int ind){ //adds all the suffix hashes of s[ind] rep(i, s[ind].size()) hshs[haS1[ind][i]]++; } void del(int ind){ //deletes all the suffix hashes of s[ind] rep(i, s[ind].size()) hshs[haS1[ind][i]]--; } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); cin >> n >> m; rep(i, n) cin >> s[i]; sort(s, s + n); rep(i, n){ ll hsh = 1LL; for(int j = 1; j <= (int)s[i].size(); j++){ hsh = (hsh * 179) + (ll)(s[i][j - 1] - 'a') + 1; hsh %= MOD; haS[i].pb(hsh); } } rep(i, n){ ll hsh = 1LL; for(int j = (int)s[i].size(); j >= 1; j--){ hsh = (hsh * 179) + (ll)(s[i][j - 1] - 'a') + 1; hsh %= MOD; haS1[i].pb(hsh); } } rep(i, m){ cin >> p[i].fi.fi >> p[i].fi.se; p[i].se = i; } sort(p, p + m, cmp); rep(i, m){ ll hsh = 1LL; for(int j = (int)p[i].fi.se.size(); j >= 1; j--){ hsh = (hsh * 179) + (ll)(p[i].fi.se[j - 1] - 'a') + 1; hsh %= MOD; } h[i] = hsh; } rep(i, m){ ll hsh = 1LL; for(int j = 1; j <= (int)p[i].fi.fi.size(); j++){ hsh = (hsh * 179) + (ll)(p[i].fi.fi[j - 1] - 'a') + 1; hsh %= MOD; haP[i].pb(hsh); } } vi ext(m, 0), ans(m, 0); repn(i, 1, m){ if(p[i].fi.fi.size() >= p[i - 1].fi.fi.size()){ int f = 1; rep(j, p[i - 1].fi.fi.size()){ if(p[i].fi.fi[j] != p[i - 1].fi.fi[j]){ f = 0; break; } } ext[i] = f; } } int l = 1e9, r = 0; int hii = 0; rep(i, m){ if(ext[i]){ //we would always narrow the [l, r] range if(l == 1e9){ ans[p[i].se] = 0; continue; } //modify the range repn(j, l, r + 1){ if(s[j].size() < p[i].fi.fi.size()){ del(j); l++; continue; } if(haS[j][(int)p[i].fi.fi.size() - 1] == haP[i][(int)p[i].fi.fi.size() - 1]) break; del(j); l++; } for(int j = r; j >= l; j--){ if(s[j].size() < p[i].fi.fi.size()){ del(j); r--; continue; } if(haS[j][(int)p[i].fi.fi.size() - 1] == haP[i][(int)p[i].fi.fi.size() - 1]) break; del(j); r--; } if(l > r) l = 1e9; } else{ l = 1e9, r = 0; hshs.clear(); int lo = hii, hi = n - 1; while(lo < hi){ int mid = (lo + hi + 1) / 2; if(s[mid] < p[i].fi.fi) lo = mid; else hi = mid - 1; } hii = max(hii, lo); if(lo == 0 && s[lo] >= p[i].fi.fi) lo = -1; repn(j, lo + 1, n){ if(s[j].size() < p[i].fi.fi.size()) break; if(haS[j][(int)p[i].fi.fi.size() - 1] != haP[i][(int)p[i].fi.fi.size() - 1]) break; add(j); l = min(l, j), r = max(r, j); } } ans[p[i].se] = hshs[h[i]]; } rep(i, m) cout << ans[i] << '\n'; return 0; } /* Things to look out for: - Integer overflows - Array bounds - Special cases Be careful! */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...