本题主要是先将情况分为两种;
1.字符串a的第一个字符和目标字符串s相等或者不相等;
2.字符串b的第一个字符串和目标字符串s相等或者不想等;
然后再按照每个情况的位置进行深搜并将返回的值相加;
当a的下标或者b的下标的值大于n代表此情况不符合返回1
当它原本的位置本来就有值便直接返回此处的值
如果a当前的位置的值和s 相等便继续按照此位置进行搜索;
如果b当前的位置的值和s相等便继续按照此位置进行搜索;
最后将位置的值存一下,并将值进行返回。
#include<bits/stdc++.h>
using namespace std;
const int md=998244353;
int t;
int n;
int dp[300005*2][2];
int a[300005],b[300005],s[300005*2];
int dfs(int x,int y,int z){
if(x>n&&y>n)return 1;
int ans=0;
if(dp[x+y-1][z]!=-1)return dp[x+y-1][z];
if(a[x]==s[x+y-1]&&x<=n){
ans=(dfs(x+1,y,0)+ans)%md;
}
if(b[y]==s[x+y-1]&&y<=n){
ans=(dfs(x,y+1,1)+ans)%md;
}
return dp[x+y-1][z]=ans;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>t;
int ans=0;
while(t--){
ans=0;
cin>>n;
for(int i=0;i<300005*2;i++){
dp[i][0]=-1;
dp[i][1]=-1;
}
for(int i=1;i<=n;i++)cin>>a[i];
for(int j=1;j<=n;j++)cin>>b[j];
for(int i=1;i<=n*2;i++)cin>>s[i];
if(a[1]==s[1]){
ans=(ans+dfs(2,1,0))%md;
}
if(b[1]==s[1]){
ans=(dfs(1,2,1)+ans)%md;
}
cout<<ans<<endl;
}
return 0;
}