Submission #1032635

#TimeUsernameProblemLanguageResultExecution timeMemory
1032635juicySelling RNA Strands (JOI16_selling_rna)C++17
100 / 100
237 ms286928 KiB
#include <bits/stdc++.h>

using namespace std;

#ifdef LOCAL
#include "debug.h"
#else
#define debug(...) 42
#endif

const int N = 1e5 + 5, MAX = 2e6 + 5, C = 26;

struct Trie {
	int tot = 1;
	int nxt[MAX][C], ord[MAX], tout[MAX];

	int add(int p, char c) {
		if (!nxt[p][c - 'A']) {
			nxt[p][c - 'A'] = ++tot;
		}
		return nxt[p][c - 'A'];
	}

	void ins(const string &s) {
		int p = 1;
		for (char c : s) {
			p = add(p, c);
		}
	}

	int timer = 0;

	void dfs(int u) {
		ord[u] = ++timer;
		for (int i = 0; i < C; ++i) {
			if (nxt[u][i]) {
				dfs(nxt[u][i]);
			}
		}
		tout[u] = timer;
	}

	int search(const string &s) {
		int p = 1;
		for (char c : s) {
			if (!nxt[p][c - 'A']) {
				return 0;
			}
			p = nxt[p][c - 'A'];
		}
		return p;
	}
} pf, sf;

int n, m;
int ft[MAX], res[N];
string s[N];

void upd(int i, int x) {
	for (; i < MAX; i += i & -i) {
		ft[i] += x;
	}
}

int qry(int i) {
	int res = 0;
	for (; i; i -= i & -i) {
		res += ft[i];
	}
	return res;
}

int qry(int l, int r) {
	return qry(r) - qry(l - 1);
}

int main() {
	ios::sync_with_stdio(false); cin.tie(nullptr);

	cin >> n >> m;
	for (int i = 1; i <= n; ++i) {
		cin >> s[i];
		pf.ins(s[i]);
		reverse(s[i].begin(), s[i].end());
		sf.ins(s[i]);
	}
	pf.dfs(1);
	sf.dfs(1);
	vector<array<int, 2>> pt;
	for (int i = 1; i <= n; ++i) {
		int y = sf.search(s[i]);
		reverse(s[i].begin(), s[i].end());
		int x = pf.search(s[i]);
		pt.push_back({pf.ord[x], sf.ord[y]});
	}
	vector<array<int, 4>> Queries;
	for (int i = 1; i <= m; ++i) {
		string P, Q; cin >> P >> Q;
		reverse(Q.begin(), Q.end());
		int p = pf.search(P), q = sf.search(Q);
		if (p && q) {
			int x = pf.ord[p], y = pf.tout[p], a = sf.ord[q], b = sf.tout[q];
			Queries.push_back({x - 1, a, b, -i});
			Queries.push_back({y, a, b, i});
		}
	}
	sort(Queries.begin(), Queries.end());
	sort(pt.begin(), pt.end());
	int j = 0;
	for (auto [x, u, v, id] : Queries) {
		while (j < pt.size() && pt[j][0] <= x) {
			upd(pt[j][1], 1);
			++j;
		} 
		if (id > 0) {
			res[id] += qry(u, v);
		} else {
			res[-id] -= qry(u, v);
		}
	}
	for (int i = 1; i <= m; ++i) {
		cout << res[i] << "\n";
	}
	return 0;
}

Compilation message (stderr)

selling_rna.cpp: In function 'int main()':
selling_rna.cpp:111:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  111 |   while (j < pt.size() && pt[j][0] <= x) {
      |          ~~^~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...