Submission

Status:
PP-TTTTTTT

Score: 20

User: mydKN

Problemset: ทางเชื่อม

Language: cpp

Time: 1.090 second

Submitted On: 2025-03-31 20:21:25

#include<bits/stdc++.h>

using namespace std;

using ll = long long;

const ll mod = 1e9 + 7;
const int di[] = {0, 0, -1, 1};
const int dj[] = {1, -1, 0, 0};
const int maxn = 5005;

ll memo[2][maxn][3];

ll solve(int ui, int uj, int state, vector<vector<bool>> &grid, int &n){
	if(uj >= n) return 1LL;
	if(!grid[ui][uj]) return 0LL;
	if(memo[ui][uj][state] != -1) return memo[ui][uj][state];
	ll cnt = 0;
	grid[ui][uj] = 0;
	// cout << ui << " " << uj << "\n";
	if(state == 1){
		// cout << ui << " " << uj << "\n";
		if(uj + 1 >= n || grid[ui][uj+1]){
			cnt = (cnt + solve(ui, uj+1, 1, grid, n)) % mod;
		}
		if(ui - 1 >= 0 && grid[ui-1][uj]){
			cnt = (cnt + solve(ui-1, uj, 2, grid, n)) % mod;
		}
		if(ui + 1 < 2 && grid[ui+1][uj]){
			cnt = (cnt + solve(ui+1, uj, 3, grid, n)) % mod;
		}
	}
	else if(state == 2 || state == 3){
		if(uj + 1 >= n || grid[ui][uj+1]){
			cnt = (cnt + solve(ui, uj+1, 1, grid, n)) % mod;
		}
	}
	grid[ui][uj] = 1;
	return memo[ui][uj][state] = cnt;
}

void mains(){
	int n;
	cin >> n;
	vector<vector<bool>> grid(2, vector<bool>(n+5));
	memset(memo, -1, sizeof(memo));
	for(int i=0;i<2;++i){
		for(int j=0;j<n;++j){
			char ch;
			cin >> ch;
			if(ch == '.') grid[i][j] = 1;
			else grid[i][j] = 0;
			// cout << grid[i][j];
		}
		// cout << "\n";
	}
	cout << (solve(0, 0, 1, grid, n) + solve(1, 0, 1, grid, n)) % mod << "\n";
}

int main(){
	ios_base::sync_with_stdio(0);cin.tie(0);
	int q;
	cin >> q;
	while(q--) mains();
}