(Technocup 2,020 토너먼트 3)에 기초한 라운드 Codeforces # 602 (사업부. 2) C. 질러 (思维)

(Technocup 2,020 토너먼트 3)에 기초한 라운드 Codeforces # 602 (사업부. 2) C. 질러 (思维)

기술

그림 삽입 설명 여기

입력

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

산출

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

문제의 의미

당신에게 줘 케이 케이 , 괄호의 수는 쌍을 이루어야합니다 당신에게, 당신에게 괄호의 문자열을 제공합니다.

당신은 몇 가지 작업,하지 수, 문자열의 반전을 가질 수 있습니다.

당신이 문자열을 조작 불리는 수있는 방법을 물어 케이 케이 괄호로 결합 될 수있다, 즉, "정규 괄호" 케이 케이 전체. 예를 들면 :()()() 케이 케이 같다 ;(()()()) 케이 케이 같다 1 1 ;(()())() 케이 케이 같다 .

아주 간단한 질문, 첫번째 구성에 필요한 대상 심볼 문자열 후 재 열거 에스 [ 나는 ] ! = [ 나는 ] S [I]! = t [i]를 뒤에서 첫 번째를 찾을 수 에스 [ 제이 ] = = [ 나는 ] 정보 [J] == t [i]를 다음, 반전 에스 [ 나는 , 제이 ] S [I, J] . 그리고 모두 알고 동일한 날짜를

코드

#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) ·은 30000 +를 볼

추천

출처blog.csdn.net/weixin_42856843/article/details/103229107