Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define D(x) cout<<#x<<" = "<<x<<endl;
- #define mx 100
- #define mod 1000000007
- //int dx[]={1,0,-1,0};int dy[]={0,1,0,-1}; //4 Direction
- //int dx[]={1,1,0,-1,-1,-1,0,1};int dy[]={0,1,1,1,0,-1,-1,-1};//8 direction
- //int dx[]={2,1,-1,-2,-2,-1,1,2};int dy[]={1,2,2,1,-1,-2,-2,-1};//Knight Direction
- //int dx[]={2,1,-1,-2,-1,1};int dy[]={0,1,1,0,-1,-1}; //Hexagonal Direction
- int ab = 0;
- int ba = 1;
- string A,B,C;
- int total = 0;
- int cs = 1;
- int dp[mx+5][mx+5][mx+5][2];
- int vis[mx+5][mx+5][mx+5][2];
- int solve(int a, int b, int c, int ck)
- {
- int ret = 0;
- if(c == 0) return 1;
- if(a == 0 && b == 0) return 0;
- if(vis[a][b][c][ck] == cs)
- return dp[a][b][c][ck];
- vis[a][b][c][ck] = cs;
- if(a>0 && ck == ab)
- {
- ret = (ret + solve(a-1, b, c, ab))%mod;
- if(A[a-1] == C[c-1]){
- ret = (ret+ solve(a-1, b, c-1, ab))%mod;
- if(c-1>0) ret = (ret + solve(a-1,b,c-1,ba))%mod;
- }
- }
- if(b>0 && ck == ba)
- {
- ret = (ret + solve(a, b-1, c, ba))%mod;
- if(B[b-1] == C[c-1])
- {
- ret = (ret + solve(a, b-1,c-1, ba))%mod;
- if(c-1>0) ret = (ret + solve(a, b-1, c-1, ab))%mod;
- }
- }
- return dp[a][b][c][ck] =ret;
- }
- int main()
- {
- int tc;
- cin>>tc;
- while(tc--)
- {
- // memset(dp,-1,sizeof dp);
- total = 0;
- cin>>A>>B>>C;
- int la, lb, lc;
- la = A.length();
- lb = B.length();
- lc = C.length();
- int ans = (solve(la, lb, lc,ab) + solve(la, lb, lc,ba)) %mod;
- printf("Case %d: %d\n",cs++,ans);
- // D(ans);
- //D(total);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement