답안 #33391

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
33391 2017-10-25T09:35:29 Z aome Selling RNA Strands (JOI16_selling_rna) C++14
35 / 100
953 ms 1039268 KB
#include <bits/stdc++.h>
using namespace std;

const int N = 100005;

typedef pair<int, int> ii;

int n, m;
string s[N];
vector<ii> go;

int to(char ch) {
	if (ch == 'A') return 0;
	if (ch == 'G') return 1;
	if (ch == 'C') return 2;
	if (ch == 'U') return 3;
}

struct Trie {
	struct Node {
		int nxt[4], cnt;
	};

	int TIME;
	vector<Node> tree;
	vector<int> st, ed;

	Trie() {
		tree.push_back(Node()), st.push_back(0);
	}

	void update(string &s) {
		int cur = 0;
		for (int i = 0; i < s.size(); ++i) {
			int tmp = to(s[i]);
			if (!tree[cur].nxt[tmp]) {
				tree[cur].nxt[tmp] = tree.size(), tree.push_back(Node());
				st.push_back(0), ed.push_back(0);
			}
			cur = tree[cur].nxt[tmp], tree[cur].cnt++;
		}
	}

	int query(string &s) {
		int cur = 0;
		for (int i = 0; i < s.size(); ++i) {
			int tmp = to(s[i]);
			if (!tree[cur].nxt[tmp]) return 0;
			cur = tree[cur].nxt[tmp];
		}
		return tree[cur].cnt;
	}

	void dfs(int u) {
		st[u] = ++TIME;
		for (int i = 0; i < 4; ++i) {
			if (tree[u].nxt[i]) dfs(tree[u].nxt[i]); 
		}
		ed[u] = TIME;
	}

	int findU(string &s) {
		int cur = 0;
		for (int i = 0; i < s.size(); ++i) {
			int tmp = to(s[i]);
			cur = tree[cur].nxt[tmp];
		}
		return st[cur];
	}

	ii findQ(string &s) {
		int cur = 0;
		for (int i = 0; i < s.size(); ++i) {
			int tmp = to(s[i]);
			if (!tree[cur].nxt[tmp]) return ii(-1, -1);
			cur = tree[cur].nxt[tmp];
		}
		return ii(st[cur], ed[cur]);
	} 

} it[4 * N], pref;

void build(int i, int l, int r) {
	for (int j = l; j <= r; ++j) it[i].update(s[go[j].second]);
	if (l == r) return;	
	int mid = (l + r) >> 1;
	build(i << 1, l, mid), build(i << 1 | 1, mid + 1, r);
}

int query(int i, int l, int r, int u, int v, string &s) {
	if (l > v || u > r) return 0;
	if (u <= l && r <= v) return it[i].query(s);
	int mid = (l + r) >> 1;
	return query(i << 1, l, mid, u, v, s) + query(i << 1 | 1, mid + 1, r, u, v, s);
}

int main() {
	ios::sync_with_stdio(false);
	cin >> n >> m;
	for (int i = 0; i < n; ++i) {
		cin >> s[i], pref.update(s[i]);
	}
	pref.dfs(0);
	for (int i = 0; i < n; ++i) {
		int tmp = pref.findU(s[i]);
		go.push_back(ii(tmp, i));
	}
	sort(go.begin(), go.end());
	for (int i = 0; i < n; ++i) {
		reverse(s[i].begin(), s[i].end());
	}
	build(1, 0, n - 1);
	for (int i = 0; i < m; ++i) {
		string p, q; cin >> p >> q;
		ii tmp = pref.findQ(p);
		if (tmp.first == -1) {
			cout << "0\n"; continue;
		}
		int l = lower_bound(go.begin(), go.end(), ii(tmp.first, 0)) - go.begin();
		int r = lower_bound(go.begin(), go.end(), ii(tmp.second + 1, 0)) - go.begin() - 1;
		reverse(q.begin(), q.end());
		cout << query(1, 0, n - 1, l, r, q) << '\n';
	}
}

Compilation message

selling_rna.cpp: In member function 'void Trie::update(std::__cxx11::string&)':
selling_rna.cpp:34:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = 0; i < s.size(); ++i) {
                     ^
selling_rna.cpp: In member function 'int Trie::query(std::__cxx11::string&)':
selling_rna.cpp:46:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = 0; i < s.size(); ++i) {
                     ^
selling_rna.cpp: In member function 'int Trie::findU(std::__cxx11::string&)':
selling_rna.cpp:64:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = 0; i < s.size(); ++i) {
                     ^
selling_rna.cpp: In member function 'ii Trie::findQ(std::__cxx11::string&)':
selling_rna.cpp:73:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = 0; i < s.size(); ++i) {
                     ^
selling_rna.cpp: In function 'int to(char)':
selling_rna.cpp:17:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
# 결과 실행 시간 메모리 Grader output
1 Correct 33 ms 61612 KB Output is correct
2 Correct 59 ms 61612 KB Output is correct
3 Correct 53 ms 61612 KB Output is correct
4 Correct 59 ms 61612 KB Output is correct
5 Correct 56 ms 61612 KB Output is correct
6 Correct 56 ms 61612 KB Output is correct
7 Correct 43 ms 61612 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 873 ms 983044 KB Output is correct
2 Correct 953 ms 1039268 KB Output is correct
3 Correct 636 ms 376912 KB Output is correct
4 Correct 603 ms 364900 KB Output is correct
5 Correct 823 ms 847720 KB Output is correct
6 Correct 923 ms 851212 KB Output is correct
7 Correct 286 ms 189228 KB Output is correct
8 Correct 763 ms 751216 KB Output is correct
9 Correct 669 ms 677844 KB Output is correct
10 Correct 539 ms 551172 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 279 ms 71480 KB Execution timed out (wall clock limit exceeded)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 33 ms 61612 KB Output is correct
2 Correct 59 ms 61612 KB Output is correct
3 Correct 53 ms 61612 KB Output is correct
4 Correct 59 ms 61612 KB Output is correct
5 Correct 56 ms 61612 KB Output is correct
6 Correct 56 ms 61612 KB Output is correct
7 Correct 43 ms 61612 KB Output is correct
8 Correct 873 ms 983044 KB Output is correct
9 Correct 953 ms 1039268 KB Output is correct
10 Correct 636 ms 376912 KB Output is correct
11 Correct 603 ms 364900 KB Output is correct
12 Correct 823 ms 847720 KB Output is correct
13 Correct 923 ms 851212 KB Output is correct
14 Correct 286 ms 189228 KB Output is correct
15 Correct 763 ms 751216 KB Output is correct
16 Correct 669 ms 677844 KB Output is correct
17 Correct 539 ms 551172 KB Output is correct
18 Runtime error 279 ms 71480 KB Execution timed out (wall clock limit exceeded)
19 Halted 0 ms 0 KB -