C. Messy(Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3))(思维)

C. Messy(Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3))(思维)

Description

在这里插入图片描述

Input

4
8 2
()(())()
10 3
))()()()((
2 1
()
2 1
)(

Output

4
3 4
1 1
5 8
2 2
3
4 10
1 4
6 7
0
1
1 2

题意

给你一个 n n 和一个 k k ,再给你一个由括号组成的字符串,告诉你括号的数量一定是成对的。

你可以有若干次操作,数量不限,把字符串中的一段倒置。

问你如何操作能使字符串配成 k k 个“正则括号”,即括号能组合成 k k 个整体。例如:()()() k k 等于 3 3 (()()()) k k 等于 1 1 (()())() k k 等于 2 2

很简单的题,先行配置好符号要求的目标字符串 t t ,再从头枚举, s [ i ] ! = t [ i ] s[i]!=t[i] 时就从后面找第一个 s [ j ] = = t [ i ] s[j]==t[i] ,然后倒置 s [ i , j ] s[i,j] 。知道全部都和 t t 一样为止

代码

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#define m_p make_pair
#define _for(i, a) for(int i = 0; i < (a); ++i)
using namespace std;
int n, k;
vector< pair<int, int> > ans;
string s, t;

void init() {
	ans.clear();
	t.clear();
}

void sol() {
	init();
	cin >> n >> k;
	cin >> s;
	_for(i, k - 1) t += "()";
	_for(i, n / 2 - k + 1) t += '(';
	_for(i, n / 2 - k + 1) t += ')';
	_for(i, n) {
		if (s[i] != t[i]) {
			int j = 0;
			for (j = i + 1; s[j] != t[i]; j++);
			reverse(s.begin() + i, s.begin() + j + 1);
			//cout << i + 1 << " " << j + 1 << "\n";
			ans.push_back(m_p(i + 1, j + 1));
		}
	}
	cout << ans.size() << "\n";
	for (pair<int, int> &i : ans) cout << i.first << " " << i.second << "\n";
}

int main() {
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	//freopen("in.txt", "r", stdin);

	int T;
	cin >> T;
	_for(i, T) {
		sol();
	}
	return 0;
}
发布了163 篇原创文章 · 获赞 54 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_42856843/article/details/103229107