[HIHO1300]展胜地的鲤鱼旗(栈,dp)

题目链接:http://hihocoder.com/problemset/problem/1300

给一个字符串,只包含'('和')',问存在多少个子串似的括号是匹配的。

匹配规则在题干中描(蒻)(语)(文)非常烂!

维护一个栈,栈中保存'('的下标。当遇到')'并且栈非空的时候,说明已经匹配到一对括号。取出栈顶'('的位置idx。并且记录此时状态,dp(i)=dp(idx-1)+1。

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <iomanip>
 4 #include <cstring>
 5 #include <climits>
 6 #include <complex>
 7 #include <fstream>
 8 #include <cassert>
 9 #include <cstdio>
10 #include <bitset>
11 #include <vector>
12 #include <deque>
13 #include <queue>
14 #include <stack>
15 #include <ctime>
16 #include <set>
17 #include <map>
18 #include <cmath>
19 
20 using namespace std;
21 
22 //kirai maxn
23 const int maxn = 1000010;
24 int n;
25 int st[maxn], top;
26 int dp[maxn];
27 char str[maxn];
28 
29 int main() {
30     // freopen("in", "r", stdin);
31     while(~scanf("%s", str)) {
32         top = 0;
33         n = strlen(str);
34         memset(dp, 0, sizeof(dp));
35         for(int i = 0; i < n; i++) {
36             if(str[i] == '(') st[top++] = i;
37             else {
38                 if(top > 0) {
39                     int idx = st[--top];
40                     dp[i] = 1 + dp[idx-1];
41                 }
42             }
43         }
44         int ans = 0;
45         for(int i = 0; i < n; i++) {
46             printf("%d ", dp[i]);
47             ans += dp[i];
48         }
49         printf("%d\n", ans);
50     }
51     return 0;
52 }

 

posted @ 2016-05-07 00:20  Kirai  阅读(141)  评论(0编辑  收藏  举报