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;
}
posted @ 2024-07-31 19:07  UperFicial  阅读(4)  评论(0编辑  收藏  举报