Advertisement
Guest User

Subsequences forming Strings

a guest
Oct 18th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.72 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define D(x) cout<<#x<<" = "<<x<<endl;
  4. #define mx 100
  5. #define mod 1000000007
  6. //int dx[]={1,0,-1,0};int dy[]={0,1,0,-1}; //4 Direction
  7. //int dx[]={1,1,0,-1,-1,-1,0,1};int dy[]={0,1,1,1,0,-1,-1,-1};//8 direction
  8. //int dx[]={2,1,-1,-2,-2,-1,1,2};int dy[]={1,2,2,1,-1,-2,-2,-1};//Knight Direction
  9. //int dx[]={2,1,-1,-2,-1,1};int dy[]={0,1,1,0,-1,-1}; //Hexagonal Direction
  10.  
  11. int ab = 0;
  12. int ba = 1;
  13.  
  14. string A,B,C;
  15. int total = 0;
  16. int cs = 1;
  17. int dp[mx+5][mx+5][mx+5][2];
  18. int vis[mx+5][mx+5][mx+5][2];
  19.  
  20.  
  21. int solve(int a, int b, int c, int ck)
  22. {
  23.     int ret = 0;
  24.     if(c == 0) return 1;
  25.     if(a == 0 && b == 0) return 0;
  26.     if(vis[a][b][c][ck] == cs)
  27.         return dp[a][b][c][ck];
  28.     vis[a][b][c][ck] = cs;
  29.  
  30.     if(a>0 && ck == ab)
  31.     {
  32.         ret = (ret + solve(a-1, b, c, ab))%mod;
  33.         if(A[a-1] == C[c-1]){
  34.             ret = (ret+ solve(a-1, b, c-1, ab))%mod;
  35.             if(c-1>0) ret = (ret + solve(a-1,b,c-1,ba))%mod;
  36.         }
  37.     }
  38.     if(b>0 && ck == ba)
  39.     {
  40.         ret  = (ret + solve(a, b-1, c, ba))%mod;
  41.         if(B[b-1] == C[c-1])
  42.         {
  43.             ret = (ret + solve(a, b-1,c-1, ba))%mod;
  44.             if(c-1>0) ret = (ret + solve(a, b-1, c-1, ab))%mod;
  45.         }
  46.     }
  47.     return dp[a][b][c][ck] =ret;
  48. }
  49.  
  50.  
  51.  
  52. int main()
  53. {
  54.     int tc;
  55.     cin>>tc;
  56.     while(tc--)
  57.     {
  58.        // memset(dp,-1,sizeof dp);
  59.         total = 0;
  60.         cin>>A>>B>>C;
  61.         int la, lb, lc;
  62.         la = A.length();
  63.         lb = B.length();
  64.         lc = C.length();
  65.         int ans = (solve(la, lb, lc,ab) + solve(la, lb, lc,ba)) %mod;
  66.         printf("Case %d: %d\n",cs++,ans);
  67.         // D(ans);
  68.         //D(total);
  69.     }
  70.     return 0;
  71.  
  72.  
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement