Submission #1283239

#TimeUsernameProblemLanguageResultExecution timeMemory
1283239thuhienneSelling RNA Strands (JOI16_selling_rna)C++20
35 / 100
177 ms166724 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAX = 1000009;

#define re exit(0);
#define thuhien "JOI16_RNA"
#define count __count__

int n,m;
string s[100009];

int trie[MAX][27],maxpos[MAX],minpos[MAX],trienode;

void add(string & s,int pos) {
	int currnode = 0;
	for (auto c : s) {
		if (!trie[currnode][c - 'A']) trie[currnode][c - 'A'] = ++trienode;
		currnode = trie[currnode][c - 'A'];
		
		if (maxpos[currnode] == 0) maxpos[currnode] = pos;
		else maxpos[currnode] = max(maxpos[currnode],pos);
		if (minpos[currnode] == 0) minpos[currnode] = pos;
		else minpos[currnode] = min(minpos[currnode],pos);
		
	}
}
pair <int,int> get(string & s) {
	int currnode = 0;
	for (auto c : s) {
		if (!trie[currnode][c - 'A']) return {n + 1,n + 1};
		currnode = trie[currnode][c - 'A'];
	}
	return {minpos[currnode],maxpos[currnode]};
}

int revtrie[MAX][27],revtrienode;
vector <int> count[MAX];
void revadd(string & s,int pos) {
	int currnode = 0;
	for (auto c : s) {
		if (!revtrie[currnode][c - 'A']) revtrie[currnode][c - 'A'] = ++revtrienode;
		currnode = revtrie[currnode][c - 'A'];
		count[currnode].push_back(pos);
	}
}
int revget(string & s,pair <int,int> range) {
	int currnode = 0;
	for (auto c : s) {
		if (!revtrie[currnode][c - 'A']) return 0;
		currnode = revtrie[currnode][c - 'A'];
	}
	return upper_bound(count[currnode].begin(),count[currnode].end(),range.second) - 
		   lower_bound(count[currnode].begin(),count[currnode].end(),range.first);
}


int main() {
  ios_base::sync_with_stdio(0);cin.tie(nullptr);
	if (fopen(thuhien".inp","r")) {
		freopen(thuhien".inp","r",stdin);
		freopen(thuhien".out","w",stdout);
	}
	
	cin >> n >> m;
	for (int i = 1;i <= n;i++) cin >> s[i];
	sort(s + 1,s + 1 + n);

	for (int i = 1;i <= n;i++) {
		add(s[i],i);
		reverse(s[i].begin(),s[i].end());
		revadd(s[i],i);
	}
	
	while (m--) {
		string prefix,suffix;cin >> prefix >> suffix;
		reverse(suffix.begin(),suffix.end());
		cout << revget(suffix,get(prefix)) << '\n';
	}

}

Compilation message (stderr)

selling_rna.cpp: In function 'int main()':
selling_rna.cpp:61:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   61 |                 freopen(thuhien".inp","r",stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
selling_rna.cpp:62:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   62 |                 freopen(thuhien".out","w",stdout);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...