Submission #515869

# Submission time Handle Problem Language Result Execution time Memory
515869 2022-01-20T04:20:49 Z amunduzbaev Selling RNA Strands (JOI16_selling_rna) C++14
60 / 100
1500 ms 74380 KB
#include "bits/stdc++.h"
using namespace std;

#define ar array

const int N = 2e6 + 5;
const int P = 167;
const int mod = (119 << 23) + 1;

signed main(){
	ios::sync_with_stdio(0); cin.tie(0);
	
	int n, m; cin>>n>>m;
	vector<string> s(n), r(n);
	vector<vector<int>> pref(n), suff(n);
	for(int i=0;i<n;i++){
		cin>>s[i]; 
	} sort(s.begin(), s.end());
	
	for(int i=0;i<n;i++){
		pref[i].resize(s[i].size());
		suff[i].resize(s[i].size());
		r[i] = s[i];
		reverse(r[i].begin(), r[i].end());
		for(int j=0;j<(int)s[i].size();j++){
			if(j) pref[i][j] = pref[i][j-1], suff[i][j] = suff[i][j-1];
			pref[i][j] = (pref[i][j] * 1ll * P + s[i][j]) % mod;
			suff[i][j] = (suff[i][j] * 1ll * P + r[i][j]) % mod;
		} 
	}
	
	vector<vector<ar<int, 4>>> qq(N);
	vector<int> res(m);
	for(int i=0;i<m;i++){
		string p, q; cin>>p>>q; 
		reverse(q.begin(), q.end());
		int h1 = 0, h2 = 0;
		for(int j=0;j<(int)p.size();j++) h1 = (h1 * 1ll * P + p[j]) % mod;
		for(int j=0;j<(int)q.size();j++) h2 = (h2 * 1ll * P + q[j]) % mod;
		qq[(int)p.size() - 1].push_back({h1, (int)q.size() - 1, h2, i});
	}
	vector<ar<int, 2>> seg; seg.push_back({0, n});
	vector<int> par(n);
	vector<vector<map<int, int>>> pre(n);
	const int B = 10000;
	
	for(int i=0;i<N;i++){
		map<int, int> mm;
		vector<ar<int, 2>> tmp;
		
		for(auto r : seg){
			int last = r[0];
			while(last < r[1] && (int)s[last].size() == i) last++;
			for(int j=last + 1;j<r[1];j++){
				if(pref[j][i] == pref[j-1][i]) continue;
				mm[pref[j-1][i]] = last; 
				tmp.push_back({last, j}); last = j;
			} if(last < r[1]){
				mm[pref[r[1] - 1][i]] = last;
				tmp.push_back({last, r[1]});
			}
		} swap(seg, tmp);
		
		for(auto r : seg){
			if(r[1] - r[0] <= B) { par[r[0]] = r[1]; continue; }
			if(par[r[0]] == r[1]) continue;
			par[r[0]] = r[1];
			pre[r[0]].clear();
			for(int j=r[0];j<r[1];j++){
				if(pre[r[0]].size() < s[j].size()) pre[r[0]].resize(s[j].size());
				for(int l=0;l<(int)s[j].size();l++){
					pre[r[0]][l][suff[j][l]]++;
				}
			}
		}
		
		for(auto x : qq[i]){
			if(!mm.count(x[0])) continue;
			int l = mm[x[0]], r = par[l];
			if(r - l <= B){
				for(int j=l;j<r;j++){
					if((int)s[j].size() <= x[1]) continue;
					res[x[3]] += (suff[j][x[1]] == x[2]);
				} 
			} else {
				res[x[3]] = pre[l][x[1]][x[2]];
			}
		}
	}
	
	for(int i=0;i<m;i++){
		cout<<res[i]<<"\n";
	}
}
# Verdict Execution time Memory Grader output
1 Correct 33 ms 47276 KB Output is correct
2 Correct 33 ms 47240 KB Output is correct
3 Correct 34 ms 47240 KB Output is correct
4 Correct 36 ms 47280 KB Output is correct
5 Correct 33 ms 47308 KB Output is correct
6 Correct 43 ms 47304 KB Output is correct
7 Correct 34 ms 47232 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 101 ms 67444 KB Output is correct
2 Correct 154 ms 68064 KB Output is correct
3 Correct 466 ms 67864 KB Output is correct
4 Correct 485 ms 68296 KB Output is correct
5 Correct 327 ms 61040 KB Output is correct
6 Correct 331 ms 61372 KB Output is correct
7 Correct 123 ms 62516 KB Output is correct
8 Correct 243 ms 68440 KB Output is correct
9 Correct 227 ms 68208 KB Output is correct
10 Correct 369 ms 68248 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 65 ms 58464 KB Output is correct
2 Correct 427 ms 54556 KB Output is correct
3 Correct 433 ms 56668 KB Output is correct
4 Correct 746 ms 54728 KB Output is correct
5 Correct 251 ms 54420 KB Output is correct
6 Correct 334 ms 56396 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 33 ms 47276 KB Output is correct
2 Correct 33 ms 47240 KB Output is correct
3 Correct 34 ms 47240 KB Output is correct
4 Correct 36 ms 47280 KB Output is correct
5 Correct 33 ms 47308 KB Output is correct
6 Correct 43 ms 47304 KB Output is correct
7 Correct 34 ms 47232 KB Output is correct
8 Correct 101 ms 67444 KB Output is correct
9 Correct 154 ms 68064 KB Output is correct
10 Correct 466 ms 67864 KB Output is correct
11 Correct 485 ms 68296 KB Output is correct
12 Correct 327 ms 61040 KB Output is correct
13 Correct 331 ms 61372 KB Output is correct
14 Correct 123 ms 62516 KB Output is correct
15 Correct 243 ms 68440 KB Output is correct
16 Correct 227 ms 68208 KB Output is correct
17 Correct 369 ms 68248 KB Output is correct
18 Correct 65 ms 58464 KB Output is correct
19 Correct 427 ms 54556 KB Output is correct
20 Correct 433 ms 56668 KB Output is correct
21 Correct 746 ms 54728 KB Output is correct
22 Correct 251 ms 54420 KB Output is correct
23 Correct 334 ms 56396 KB Output is correct
24 Correct 721 ms 69464 KB Output is correct
25 Execution timed out 1599 ms 74380 KB Time limit exceeded
26 Halted 0 ms 0 KB -