Saturday, March 9, 2019

[Codeforces] F. Bracket Substring

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : F. Bracket Substring
Source            : Codeforces
Category          : Dynamic Programing + String
Algorithm         : Dynamic Programing, KMP
Verdict           : Accepted

  1. #include "bits/stdc++.h"  
  2.   
  3. using namespace std;  
  4.   
  5. #define vi          vector <int>  
  6. #define eb          emplace_back  
  7. #define ll          long long int  
  8.   
  9. static const int maxn = 200 + 5;  
  10. static const ll  mod = 1e9 + 7;  
  11.   
  12. vi LPS(string pat)  
  13. {  
  14.       int len = pat.size();  
  15.       int i = 1;  
  16.       int j = 0;  
  17.       vi lps;  
  18.       lps.eb(0);  
  19.       while (i < len)  
  20.       {  
  21.             if (pat[i] == pat[j])  
  22.             {  
  23.                   i++;  
  24.                   j++;  
  25.                   lps.eb(j);  
  26.             }  
  27.             else  
  28.             {  
  29.                   if (j) j = lps[j-1];  
  30.                   else lps.eb(0), i++;  
  31.             }  
  32.       }  
  33.       return lps;  
  34. }  
  35.   
  36. vi lps;  
  37. string pat;  
  38.   
  39. int kmp(int id, char brac)  
  40. {  
  41.       while (id > 0 && brac != pat[id]) id = lps[id-1];  
  42.       if (brac == pat[id]) ++id;  
  43.       return id;  
  44. }  
  45.   
  46. ll dp[maxn][maxn][maxn];  
  47. bool memoize[maxn][maxn][maxn];  
  48. int n;  
  49.   
  50. ll solve(int pos, int open, int found)  
  51. {  
  52.       if (pos >= 2*n) return (open == 0 && found >= pat.size());  
  53.       ll &ret = dp[pos][open][found];  
  54.       bool &mem = memoize[pos][open][found];  
  55.       if (mem) return ret;  
  56.       mem = 1;  
  57.       ll choice1 = 0;  
  58.       ll choice2 = 0;  
  59.       {  
  60.             int fnd = found;  
  61.             if (fnd < pat.size()) fnd = kmp(fnd, '(');  
  62.             choice1 = (choice1 + solve(pos+1, open+1, fnd)) % mod;  
  63.       }  
  64.       {  
  65.             if (open)  
  66.             {  
  67.                   int fnd = found;  
  68.                   if (fnd < pat.size()) fnd = kmp(found, ')');  
  69.                   choice2 = (choice2 + solve(pos+1, open-1, fnd)) % mod;  
  70.             }  
  71.       }  
  72.       return ret = (choice1 + choice2) % mod;  
  73. }  
  74.   
  75. int main()  
  76. {  
  77.       ios_base::sync_with_stdio(false);  
  78.       cin.tie(nullptr);  
  79.       #ifndef ONLINE_JUDGE  
  80.             freopen("in.txt""r", stdin);  
  81.       #endif // ONLINE_JUDGE  
  82.   
  83.       cin >> n >> pat;  
  84.       lps = LPS(pat);  
  85.       cout << solve(0, 0, 0);  
  86. }  

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.