제출 #1267516

#제출 시각아이디문제언어결과실행 시간메모리
1267516nlsosadSelling RNA Strands (JOI16_selling_rna)C++20
100 / 100
226 ms264888 KiB
#include <bits/stdc++.h>
using namespace std;
string a[100001], p[100001], q[100001], ra[100001];
int res[100001];

vector<int> tv[1000002], luu[1000002];
int sum[1000002];
int idx[26];

struct trie{
	struct node{
		int nxt[4];
		int cnt;
		node(){
			nxt[0] = nxt[1]=nxt[2] = nxt[3] = 0;
			cnt = 0;
		}
	};
	vector<node> tr;
	int lst = 1;
	void init(){
		tr.resize(1);
	}
	void add(string &s, int tro){
		int moc = 0;
		for (char i:s){
			int id = idx[i-'A'];
			if(tr[moc].nxt[id]==0){
				node tmp;
				tr.push_back(tmp);
				tr[moc].nxt[id] = lst;
				moc = lst;
				lst++;
			}else{
				moc = tr[moc].nxt[id];
			}
			tr[moc].cnt++;
		}
		if(tro!=-1){
			tv[moc].push_back(tro);
		}
	}
	
	void cook(string &s, int tro){
		int moc = 0;
		for (char i:s){
			int id = idx[i-'A'];
			if(tr[moc].nxt[id]==0)break;
			moc = tr[moc].nxt[id];
		}
		if(moc==0)return;
		luu[moc].push_back(tro);
		sum[moc] += a[tro].size();
	}
	int count(string &s){
		int moc = 0;
		for (char i:s){
			int id = idx[i-'A'];
			moc = tr[moc].nxt[id];
			if(moc==0)return 0;
		}
		return tr[moc].cnt;
	}
};

trie con[1000002];
trie cay;

void dfs(int u){
	for (int i = 0;i<4;++i){
		if(cay.tr[u].nxt[i]!=0){
			dfs(cay.tr[u].nxt[i]);
			int v = cay.tr[u].nxt[i];
			if(sum[u] < sum[v]){
				swap(con[u], con[v]);
				swap(sum[u], sum[v]);
				swap(luu[u], luu[v]);
			}
			for (int j:luu[v]){
				con[u].add(ra[j], -1);
				luu[u].push_back(j);
			}
			sum[u] += sum[v];
		}
	}
	for (int i:tv[u]){
		res[i] = con[u].count(q[i]);
		// cout << u << ' ' << i << ' ' << q[i] << " NGU\n";
	}
}

int main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int n, m;
	cin >> n>> m;
	for (int i = 1;i<=n;++i){
		cin >> a[i];
		ra[i] = a[i];
		reverse(ra[i].begin(), ra[i].end());
	}
	idx['A'-'A'] = 0;
	idx['C'-'A'] = 1;
	idx['G'-'A'] = 2;
	idx['U'-'A'] = 3;
	cay.init();
	for (int i = 1;i<=m;++i){
		cin >> p[i] >> q[i];
		reverse(q[i].begin(), q[i].end());
		cay.add(p[i], i);
	}
	for (int i = 1;i<=n;++i){
		cay.cook(a[i], i);
	}
	int lst = cay.lst;
	// cout << lst << '\n';
	for (int i = 0;i<lst;++i){
		con[i].init();
		for (int j:luu[i]){
			con[i].add(ra[j], -1);
		}
	}
	// cout << q[3];return 0;
	// cout << con[3].lst;return 0;
	// cout << luu[3].size();return 0;
	// cout << con[3].count(q[3]);return 0;
	dfs(0);
	for (int i = 1;i<=m;++i){
		cout << res[i] << '\n';
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...