Submission #617954

#TimeUsernameProblemLanguageResultExecution timeMemory
617954GusterGoose27Match (CEOI16_match)C++11
100 / 100
43 ms29068 KiB
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1e5;

class Trie {
public:
	map<int, Trie*> nexttrie;
	Trie *par;
	map<int, vector<int>> occs;
	Trie(Trie *p = nullptr) {
		par = p;
	}
};

string s;
int n;
bool seq[MAXN];
int nums[MAXN];
int nextocc[MAXN+1][20]; // [l, r)
Trie *cur;
Trie *tries[MAXN];

void make_occ(Trie *t, int v) {
	t->occs[nums[v]].push_back(v);
}

void make(int l, int r) {
	if (r < l) return;
	cur = tries[l];
	int num = nums[l];
	assert(cur->occs[num].back() > l);
	int mn = 0;
	int mx = cur->occs[num].size();
	while (mx > mn+1) {
		int c = (mn+mx)/2;
		if (cur->occs[num][c] <= r) mn = c;
		else mx = c;
	}
	int rp = cur->occs[num][mn];
	assert(rp > l);
	seq[l] = 0;
	seq[rp] = 1;
	make(l+1, rp-1);
	make(rp+1, r);
}

int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	cur = new Trie();
	cin >> s;
	n = s.size();
	for (int i = 0; i < n; i++) {
		nums[i] = s[i]-'a';
		nextocc[i][0] = i;
	}
	vector<int> stck;
	for (int i = 0; i < n; i++) {
		tries[i] = cur;
		if (!stck.empty() && nums[i] == nums[stck.back()]) {
			cur = cur->par;
			stck.pop_back();
		}
		else {
			if (cur->nexttrie.find(nums[i]) == cur->nexttrie.end()) cur->nexttrie[nums[i]] = new Trie(cur);
			cur = cur->nexttrie[nums[i]];
			stck.push_back(i);
		}
		make_occ(cur, i);
	}
	if (!stck.empty()) {
		cout << "-1\n";
		return 0;
	}
	nextocc[n][0] = n;
	for (int j = 1; j < 20; j++) {
		for (int i = 0; i <= n; i++) nextocc[i][j] = nextocc[nextocc[i][j-1]][j-1];
	}
	make(0, n-1);
	char convert[2];
	convert[0] = '(';
	convert[1] = ')';
	for (int i = 0; i < n; i++) cout << convert[seq[i]];
	cout << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...