Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <string>
- #include <stack>
- #include <algorithm>
- #include <bitset>
- #include <math.h>
- #include <queue>
- #include <map>
- #include <set>
- #include <limits.h>
- #include <limits>
- #include <stdio.h>
- #include <stdlib.h>
- #include <cstring>
- #include <sstream>
- #include <string.h>
- #define MOD 1000000007
- using namespace std;
- char s[700];
- int N, m[700];
- int dp[705][705][3][3];
- stack <int> st;
- int dfs(int l, int r, int cl, int cr){
- if(dp[l][r][cl][cr] != -1)return dp[l][r][cl][cr];
- if(l > r)return 1;
- int k = m[l];
- long long res = 0;
- if(k == r){
- for(int i = 0; i <= 2; i++)
- for(int j = 0; j <= 2; j++)
- if((i == 0) ^ (j == 0) && (cl != i || cl == 0) && (cr != i || cl == 0))
- res = (res + dfs(l + 1, r - 1, i, j)) % MOD;
- }else{
- for(int i = 0; i <= 2; i++)
- for(int j = 0; j <= 2; j++)
- if((i == 0) ^ (j == 0) && (cl != i || cl == 0))
- res = (res + (long long)dfs(l + 1, k - 1, i, j) * dfs(k + 1, r, j, cr)) % MOD;
- }
- return dp[l][r][cl][cr] = res;
- }
- int main(){
- scanf("%s", &s);
- N = strlen(s);
- for(int i = 0; i < N; i++){
- if(s[i] == '(')
- st.push(i);
- else{
- int k = st.top();
- st.pop();
- m[k] = i;
- m[i] = k;
- }
- }
- memset(dp, -1, sizeof dp);
- printf("%d\n", dfs(0, N - 1, 0, 0));
- return 0;
- }
Add Comment
Please, Sign In to add comment