水题。
1 #include <cstdio> 2 #include <cstring> 3 const int N = 1000010; 4 5 int stk[N], top; 6 7 inline void max(int &a, int b) { 8 if(a < b) a = b; 9 return; 10 } 11 12 inline int dig(char c) { 13 if(c == '(') return 1; 14 if(c == ')') return -1; 15 if(c == '[') return 2; 16 if(c == ']') return -2; 17 if(c == '{') return 3; 18 if(c == '}') return -3; 19 printf("ERROR!\n"); 20 return 0; 21 } 22 23 int main() { 24 freopen("sequence.in", "r", stdin); 25 char s[N]; 26 int ans, ta; 27 while(scanf("%s", s) != EOF) { 28 ans = top = ta = 0; 29 for(int i = 0; i < strlen(s); i++) { 30 int p = dig(s[i]); 31 //printf("%d\n", p); 32 if(p + stk[top] == 0) { 33 ans++; 34 top--; 35 } 36 else if(p > 0) { 37 stk[++top] = p; 38 ans++; 39 } 40 else { 41 if(top) ans -= top; 42 max(ta, ans); 43 ans = top = 0; 44 } 45 //printf("ans = %d\n", ans); 46 } 47 if(top) { 48 ans -= top; 49 } 50 max(ta, ans); 51 printf("%d\n", ta); 52 } 53 return 0; 54 }
括号画家
Candela是一名漫画家,她有一个奇特的爱好,就是在纸上画括号。这一天,刚刚起床的Candela画了一排括号序列,其中包含小括号()、中括号[]和大括号{},总长度为N。这排随意绘制的括号序列显得杂乱无章,于是Candela定义了什么样的括号序列是美观的:
空的括号序列是美观的;
若括号序列A是美观的,则括号序列(A)、[A]、{A}也是美观的;
若括号序列A、B都是美观的,则括号序列AB也是美观的;
例如 [(){}]() 是美观的括号序列,而 )({)[}]( 则不是。
现在Candela想在她绘制的括号序列中,找出其中连续的一段,满足这段子序列是美观的,并且长度尽量大。你能帮帮她吗?
输入:
第一行1个整数N,第二行1个长度为N的括号序列。
各个测试点的N的大小:5,10,50,100,100,1000,1000,10000,10000,10000
输出:
一个整数,表示最长的美观的连续子序列的长度。