제출 #40742

#제출 시각아이디문제언어결과실행 시간메모리
40742IvanCSelling RNA Strands (JOI16_selling_rna)C++14
100 / 100
369 ms205308 KiB
#include <bits/stdc++.h>
using namespace std;
typedef vector<int>::iterator vit;
const int MAXN = (int)1e5 + 10;
const int MAXL = (int)2*1e6 + 10;
vector<int> queries[MAXL],folhas[MAXL];
vector<int> *cjt[MAXL];
string S[MAXN],Q[MAXN];
int Trie1[MAXL][4],Trie2[MAXL][4],ptr1,ptr2;
int resposta[MAXN],sz[MAXL],qtd[MAXL],N,M;
inline int transforma(char c){
	if(c == 'A') return 0;
	else if(c == 'G') return 1;
	else if(c == 'C') return 2;
	else return 3;
}
void add_reverse(int idx){
	int atual = 1;
	for(int i = 0;i<S[idx].size();i++){
		int c = transforma(S[idx][i]);
		if(Trie2[atual][c]){
			atual = Trie2[atual][c];
		}
		else{
			Trie2[atual][c] = ++ptr2;
			atual = ptr2;
		}
		qtd[atual]++;
	}
}
void remove_reverse(int idx){
	int atual = 1;
	for(int i = 0;i<S[idx].size();i++){
		int c = transforma(S[idx][i]);
		atual = Trie2[atual][c];
		qtd[atual]--;
	}
}
void add_normal(int idx){
	int atual = 1;
	for(int i = 0;i<S[idx].size();i++){
		int c = transforma(S[idx][i]);
		if(Trie1[atual][c]){
			atual = Trie1[atual][c];
		}
		else{
			Trie1[atual][c] = ++ptr1;
			atual = ptr1;
		}
		sz[atual] += (int)S[idx].size();
	}
	folhas[atual].push_back(idx);
}
int query_reverse(int idx){
	int atual = 1;
	for(int i = 0;i<Q[idx].size();i++){
		int c = transforma(Q[idx][i]);
		atual = Trie2[atual][c];
	} 
	return qtd[atual];
}
void add_query(int idx){
	int atual = 1;
	for(int i = 0;i<Q[idx].size();i++){
		int c = transforma(Q[idx][i]);
		atual = Trie1[atual][c];
	}
	queries[atual].push_back(idx);
}
void dfs(int v,int keep){
	int mx = -1,big = -1;
	for(int i = 0;i<4;i++){
		int u = Trie1[v][i];
		if(!u) continue;
		if(sz[u] > mx){
			big = u;
			mx = sz[u];
		}
	}
	for(int i = 0;i<4;i++){
		int u = Trie1[v][i];
		if(!u || u == big) continue;
		dfs(u,0);
	}
	if(big != -1){
		dfs(big,1);
		cjt[v] = cjt[big];
		for(vit it = folhas[v].begin();it != folhas[v].end();it++){
			add_reverse(*it);
			cjt[v]->push_back(*it);
		}
	}
	else{
		cjt[v] = new vector<int>();
		for(vit it = folhas[v].begin();it != folhas[v].end();it++){
			add_reverse(*it);
			cjt[v]->push_back(*it);
		}
	}
	for(int i = 0;i<4;i++){
		int u = Trie1[v][i];
		if(!u || u == big) continue;
		for(vit it = cjt[u]->begin();it != cjt[u]->end();it++){
			add_reverse(*it);
			cjt[v]->push_back(*it);
		}
	}
	for(vit it = queries[v].begin();it != queries[v].end();it++) resposta[*it] = query_reverse(*it);
	if(keep == 0){
		for(vit it = cjt[v]->begin();it != cjt[v]->end();it++){
			remove_reverse(*it);
		}
	}
}
int main(){
	cin.tie(0);ios_base::sync_with_stdio(0);
	cin >> N >> M;
	ptr1 = ptr2 = 1;
	for(int i = 1;i<=N;i++){
		cin >> S[i];
		add_normal(i);
		reverse(S[i].begin(),S[i].end());
	}
	for(int i = 1;i<=M;i++){
		cin >> Q[i];
		add_query(i);
		cin >> Q[i];
		reverse(Q[i].begin(),Q[i].end());
	}
	dfs(1,1);
	for(int i = 1;i<=M;i++) printf("%d\n",resposta[i]);
	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

selling_rna.cpp: In function 'void add_reverse(int)':
selling_rna.cpp:19:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0;i<S[idx].size();i++){
                 ^
selling_rna.cpp: In function 'void remove_reverse(int)':
selling_rna.cpp:33:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0;i<S[idx].size();i++){
                 ^
selling_rna.cpp: In function 'void add_normal(int)':
selling_rna.cpp:41:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0;i<S[idx].size();i++){
                 ^
selling_rna.cpp: In function 'int query_reverse(int)':
selling_rna.cpp:56:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0;i<Q[idx].size();i++){
                 ^
selling_rna.cpp: In function 'void add_query(int)':
selling_rna.cpp:64:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0;i<Q[idx].size();i++){
                 ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...