CF1499E Chaotic Merge
对于 \(l_1=1,r_1=1\) 的情况,设 \(f_{i,j,0/1,S}\) 表示 \(\texttt{x}\) 串考虑了前 \(i\) 个位置,\(\texttt{y}\) 串考虑了前 \(j\) 个位置,且最后一个位置选了 \(\texttt{x}\) 串还是 \(\texttt{y}\) 串,选的串的集合为 \(S\) 的方案数。
转移显然。答案为 \(\sum_{i=1}^n\sum_{j=1}^mf_{i,j,0/1,3}\)。
对于 \(l_1\neq 1\) 或 \(r_1\neq 1\) 的情况,我们所有 \((i,j)\) 满足 \(i\neq 0\) 或 \(j\neq 0\) 进行初始化,设 \(f_{i,j,0,1}=1\) 和 \(f_{i,j,1,2}=1\),表示从这里开始多了一个新串。
“初始化”的步骤值得借鉴。
int main()
{
scanf("%s%s",x+1,y+1);
n=strlen(x+1),m=strlen(y+1);
rep(i,0,n) rep(j,0,m)
{
if(i<n) f[i+1][j][0][1]=add(f[i+1][j][0][1],1);
if(j<m) f[i][j+1][1][2]=add(f[i][j+1][1][2],1);
rep(S,0,3)
{
if(i<n&&i>0&&x[i+1]!=x[i]) f[i+1][j][0][S|1]=add(f[i+1][j][0][S|1],f[i][j][0][S]);
if(i<n&&j>0&&x[i+1]!=y[j]) f[i+1][j][0][S|1]=add(f[i+1][j][0][S|1],f[i][j][1][S]);
if(j<m&&i>0&&y[j+1]!=x[i]) f[i][j+1][1][S|2]=add(f[i][j+1][1][S|2],f[i][j][0][S]);
if(j<m&&j>0&&y[j+1]!=y[j]) f[i][j+1][1][S|2]=add(f[i][j+1][1][S|2],f[i][j][1][S]);
}
}
int ans=0;
rep(i,1,n) rep(j,1,m) ans=add(ans,f[i][j][0][3],f[i][j][1][3]);
printf("%d\n",ans);
return 0;
}