func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MOD = 1000000007;   const int N = 710;   string s;   int n, t[N];   stack<int> st;   struct node {     long long f[3][3];     void init() {       for (int i = 1; i <= 2; i++) f[i][0] = f[0][i] = 1;     }     node() { memset(f, 0, sizeof(f)); }     void mergein(node t) {       for (int i = 0; i <= 2; i++)         for (int j = 0; j <= 2; j++)           if ((i == 0 || j == 0) && i != j)             for (int i1 = 0; i1 <= 2; i1++)               for (int j1 = 0; j1 <= 2; j1++)                 if ((i1 != i || i1 + i == 0) && (j1 != j || j1 + j == 0))                   f[i][j] = (f[i][j] + t.f[i1][j1]) % MOD;     }     void mergenear(node x, node y) {       for (int i = 0; i <= 2; i++)         for (int j = 0; j <= 2; j++)           for (int i1 = 0; i1 <= 2; i1++)             for (int j1 = 0; j1 <= 2; j1++)               if (i1 != j1 || i1 + j1 == 0)                 f[i][j] = (f[i][j] + (x.f[i][i1] * y.f[j1][j]) % MOD) % MOD;     }   };   node DAC(int l, int r) {     node tmp;     if (t[l] == r) {       if (l == r - 1)         tmp.init();       else         tmp.mergein(DAC(l + 1, r - 1));     } else       tmp.mergenear(DAC(l, t[l]), DAC(t[l] + 1, r));     return tmp;   }   void prepare() {     cin >> s;     n = s.length();   }   void solve() {     for (int i = 1; i <= n; i++)       if (s[i - 1] ==  ( )         st.push(i);       else         t[i] = st.top(), st.pop(), t[t[i]] = i;     node ans = DAC(1, n);     long long way = 0;     for (int i = 0; i <= 2; i++)       for (int j = 0; j <= 2; j++) way = (way + ans.f[i][j]) % MOD;     cout << way;   }   int main() {     prepare();     solve();   }   