暴风城传送门
总结
这题因为一开始使用了不方便的状态,所以调了很久。网上大部分题解都是f[i][j][k]为状态的,但我是只用了f[i][j],所以迷操了很久。
f[i][j][k]的状态和转移比较简单,而且我没有分析过,所以这里就不写了,具体看别人的总结就好。
然后我说一下我的方法。下面B用1表示,W用2表示。
f[i][j]表示填到第i个其中状态是j(j=0,1,2分别表示三种状态)的数量。
首先一开始我没有考虑11111(k=3)中到底是前111是一组还是中间111一组还是后面111是一组。所以一开始就卡了很久。
然后我决定把最后的111定成贡献,那么问题就变成a
for (int i=1;i<=n;i++) {
if (a[i]!=3) {
f[i][0]=(f[i-1][0]+f[i][0])%Mod;
f[i][1]=(f[i-1][1]+f[i][1])%Mod;
f[i][2]=(f[i-1][2]+f[i][2])%Mod;
} else {
f[i][0]=((f[i-1][0]+f[i-1][0])%Mod+f[i][0])%Mod;
f[i][1]=((f[i-1][1]+f[i-1][1])%Mod+f[i][1])%Mod;
f[i][2]=((f[i-1][2]+f[i-1][2])%Mod+f[i][2])%Mod;
}
if (i+k-1<=n) {
int j=i+k-1;
if (s2[j]-s2[i-1]==0&&a[j+1]!=1) {
f[j+1][1]=(f[i-1][0]+f[j+1][1])%Mod;
int ni=j+1,nj=ni+k-1;
if (s1[nj]-s1[ni-1]==0&&a[nj+1]!=2) {
if (nj+1<=n) f[nj+1][2]=(f[i-1][0]+f[nj+1][2])%Mod;
else f[nj][2]=(f[i-