Решение задачи "Курони и простые строки" с Codeforces

Без пояснения   Просмотров: 26


Теперь, когда Курони исполнилось 10 лет, он большой мальчик и больше не любит массивы целых чисел в качестве подарков. В этом году он хочет получить скобочную последовательность в качестве подарка на день рождения. В частности, он хочет, чтобы последовательность скобок была настолько сложной, что, как бы он ни старался, он не сможет удалить простую подпоследовательность!

Назовем строку, образованную n символами '(' или ')' простой, если ее длина n четна и положительная, ее первые n2 символов — это '(', а ее последние n2 символов — это ')'. Например, строки () и (()) являются простыми, в то время как строки )( и ()() не являются простыми.

Курони будет дана строка, образованная символами '(' и ')' (заданная строка не обязательно является простой). Операция состоит из выбора подпоследовательности символов строки, которая образует простую строку, и удаления всех символов этой подпоследовательности из строки. Заметьте, символы подпоследовательности не обязаны идти подряд. К примеру, он может применить операцию к строке ')()(()))', выбрать подпоследовательность из выделенных жирным шрифтом символов, так как они формируют простую строку '(())', удалить эти символы с строки и получить '))()'.

Курони должен выполнить минимально возможное количество операций над строкой таким образом, чтобы с оставшейся строкой больше нельзя было выполнить ни одной операции. Результирующая строка не обязана быть пустой.

Поскольку заданная строка слишком велика, Курони не может понять, как минимизировать количество операций. Можете ли вы помочь ему сделать это?

Последовательность символов a является подпоследовательностью строки b, если a может быть получена из b удалением нескольких (возможно, ни одного или всех) символов.

Код

#include <bits/stdc++.h>
using namespace std;
int main() {
	string s;
	cin >> s;
	int n = s.length();
	int l = 0, r = n - 1;
	vector<int> a,b;
	while(l < r){
		while(s[l] == ')' && l < n - 1) 
            l++;
		if(l >= r) 
            break;
		while(s[r] == '(' && r) 
            r--;
		if(l >= r) 
            break;
		a.push_back(l + 1);
		b.push_back(r + 1);
		l++;
		r--;
	}
	if(a.size()) 
        cout << "1" << endl;
	else{
		cout << "0" << endl;
		return 0;
	}
	cout << 2 * a.size() << endl;
	for(int i = 0; i < a.size(); i++) 
        cout << a[i] << " ";
	for(int i = b.size()-1; i >= 0; i--) 
        cout << b[i] << " ";
}

         

 Администратор Photo Автор: Администратор


Отправить решение задачи
Чтобы отправить решение вам нужно войти в систему или зарегистрироваться

Комментарии

Чтобы написать комментарии вам нужно войти в систему или зарегистрироваться