题目链接: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 ", ans); 50 } 51 return 0; 52 }