답안 #148115

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
148115 2019-08-31T14:01:05 Z WhipppedCream 괄호 문자열 (CEOI16_match) C++17
100 / 100
17 ms 12920 KB
#include <bits/stdc++.h>
#pragma GCC optimize ("O3")
#pragma GCC target ("sse4")
using namespace std;
#define X first
#define Y second
#define pb push_back
typedef pair<int, int> ii;
typedef long long ll;

const int maxn = 1e5+5;

char S[maxn];
int n;

int dp[maxn][30];

char ans[maxn];

bool valid()
{
	stack<char> s;
	for(int i = 0; i< n; i++)
	{
		if(s.empty() || s.top() != S[i])
		{
			s.push(S[i]);
		}
		else s.pop();
	}
	return s.empty();
}

void solve(int L, int R)
{
	if(L> R) return;
	int opt = dp[R][S[L]-'a'];
	// printf("[%d %d] match %d\n", L, R, opt);
	assert(opt> L);
	ans[L] = '('; ans[opt] = ')';
	solve(L+1, opt-1); solve(opt+1, R);
}

int main()
{
	scanf("%s", S);
	n = strlen(S);
	if(!valid())
	{
		printf("-1\n"); return 0;
	}
	for(int j = 0; j< 26; j++)
	{
		if(S[0] == 'a'+j) dp[0][j] = 0;
		else dp[0][j] = -1;
	}
	for(int i = 1; i< n; i++)
	{
		int x = dp[i-1][S[i]-'a'];
		// printf("x = %d\n", x);
		for(int j = 0; j< 26; j++)
		{
			if(S[i] == 'a'+j) dp[i][j] = i;
			else if(x >= 1) dp[i][j] = dp[x-1][j];
			else dp[i][j] = -1;
			// printf("dp[%d][%d] = %d\n", i, j, dp[i][j]);
		}
	}
	solve(0, n-1);
	ans[n] = '\0';
	printf("%s\n", ans);
}

Compilation message

match.cpp: In function 'int main()':
match.cpp:46:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%s", S);
  ~~~~~^~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 400 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 400 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 2 ms 376 KB Output is correct
5 Correct 2 ms 376 KB Output is correct
6 Correct 2 ms 504 KB Output is correct
7 Correct 2 ms 504 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 400 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 2 ms 376 KB Output is correct
5 Correct 2 ms 376 KB Output is correct
6 Correct 2 ms 504 KB Output is correct
7 Correct 2 ms 504 KB Output is correct
8 Correct 3 ms 1144 KB Output is correct
9 Correct 3 ms 1400 KB Output is correct
10 Correct 3 ms 1144 KB Output is correct
11 Correct 3 ms 1272 KB Output is correct
12 Correct 11 ms 8056 KB Output is correct
13 Correct 11 ms 8568 KB Output is correct
14 Correct 12 ms 9208 KB Output is correct
15 Correct 14 ms 10744 KB Output is correct
16 Correct 14 ms 10616 KB Output is correct
17 Correct 15 ms 11256 KB Output is correct
18 Correct 16 ms 11512 KB Output is correct
19 Correct 16 ms 12280 KB Output is correct
20 Correct 11 ms 7928 KB Output is correct
21 Correct 17 ms 12920 KB Output is correct