Submission #411784

#TimeUsernameProblemLanguageResultExecution timeMemory
411784jjjSelling RNA Strands (JOI16_selling_rna)C++14
35 / 100
1575 ms27212 KiB
#include <bits/stdc++.h>
#define MAXN 100010
#define MOD 1000000007

using namespace std;

string s;

vector < vector <long long> > v;

long long x[MAXN];

int sl(char c)
{
	if(c == 'A') return 1;
	if(c == 'G') return 2;
	if(c == 'C') return 3;
	if(c == 'U') return 4;
}


int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	
	x[0] = 1;
	
	for(int i = 1; i < MAXN; i++) x[i] = (x[i - 1] * 31) % MOD;
	
	int n, m;
	
	cin >> n >> m;
	
	v.resize(n + 1);
	
	for(int i = 0; i < n; i++)
	{
		cin >> s;
		
		int k = s.size();
		
		v[i].push_back(sl(s[0]));
		
		for(int j = 1; j < k; j++) v[i].push_back((v[i][j - 1] + sl(s[j]) * x[j]) % MOD);
	}
	
	for(int i = 0; i < m; i++)
	{
		cin >> s;
		
		long long p = 0, q = 0;
		
		int kp = s.size();
		
		p = sl(s[0]);
		
		for(int j = 1; j < kp; j++) p = (p + x[j] * sl(s[j])) % MOD;
		
		cin >> s;
		
		int kq = s.size();
		
		q = sl(s[0]);
		
		for(int j = 1; j < kq; j++) q = (q + x[j] * sl(s[j])) % MOD;
		
		int S = 0;
		
		for(int j = 0; j < n; j++)
		{
			int V = v[j].size();
			
			if(kp > V || kq > V) continue;
			
			
			if(kq != V && p == v[j][kp - 1] && ((q * x[V - kq]) % MOD) == (v[j][V - 1] - v[j][V - kq - 1] + MOD) % MOD) S++;
			else if(kq == V && p == v[j][kp - 1] && ((q * x[V - kq]) % MOD) == v[j][V - 1]) S++;
		}
		
		cout << S << "\n";
	} 
	
	return 0;
}

Compilation message (stderr)

selling_rna.cpp: In function 'int sl(char)':
selling_rna.cpp:19:1: warning: control reaches end of non-void function [-Wreturn-type]
   19 | }
      | ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...