救救孩子
查看原帖
救救孩子
693327
_tan_楼主2024/12/29 20:42
#include<bits/stdc++.h>
#define ll long long
#define reg register
#define db double
#define il inline
using namespace std;
void read(int &x){x=0;int f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}x*=f;}
void read(ll &x){x=0;int f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}x*=f;}
const int N=55;
int n,kk;char c[N];
int dp[2][N][N][N][4];
int change(int l,int j){
	int a1=l/2%2,a2=l%2;
	if(j==1){
		a1^=1;a2^=1;
	}else if(j==2){
		a1--;
		if(a1<0){
			a1=1;
		}
	}else{
		a2--;
		if(a2<0){
			a2=1;
		}
	}
	return a1*2+a2;
}
int main(){
	read(n);read(kk);
	dp[0][1][0][0][0]=1;
	scanf("%s",c+1);
	for(int i=1;i<=n;i++){
		memset(dp[i&1],0,sizeof(dp[i&1]));
		if(c[i]=='?'){
			for(int j=1;j<=3;j++){
				int a[5]={0};
				for(a[1]=0;a[1]<=i+1;a[1]++){
					for(a[2]=0;a[2]<=i+1;a[2]++){
						for(a[3]=0;a[3]<=i+1;a[3]++){
							for(int l=0;l<=3;l++){
								int tmp=change(l,j);
								
								if((tmp==3||a[tmp+1])&&(l==3||a[l+1])){
									a[tmp+1]--;int c=dp[(i&1)^1][a[1]][a[2]][a[3]][tmp];
									a[tmp+1]++;
									dp[i&1][a[1]][a[2]][a[3]][l]+=c;dp[i&1][a[1]][a[2]][a[3]][l]%=998244353;
									if(dp[i&1][a[1]][a[2]][a[3]][l]){
										cout<<a[1]<<' '<<a[2]<<' '<<a[3]<<' '<<l<<' '<<j<<' '<<tmp<<endl;
									}
								}
							}
						}
					}
				}
			}
		}else{
			int kkk=c[i]-'A'+1;
			for(int j=kkk;j<=kkk;j++){
				int a[5]={0};
				for(a[1]=0;a[1]<=i+1;a[1]++){
					for(a[2]=0;a[2]<=i+1;a[2]++){
						for(a[3]=0;a[3]<=i+1;a[3]++){
							for(int l=0;l<=3;l++){
								int tmp=change(l,j);
//								if(i==1)
//								if(a[1]==1&&a[2]==0&&a[3]==1&&l==3)cout<<tmp<<endl;
								if((tmp==3||a[tmp+1])&&(l==3||a[l+1])){
									a[tmp+1]--;int c=dp[(i&1)^1][a[1]][a[2]][a[3]][tmp];
									a[tmp+1]++;
									dp[i&1][a[1]][a[2]][a[3]][l]+=c;dp[i&1][a[1]][a[2]][a[3]][l]%=998244353;
//									if(i==3&&dp[i&1][a[1]][a[2]][a[3]][l]) {
//										cout<<a[1]<<' '<<a[2]<<' '<<a[3]<<' '<<l<<endl;
//									}
								}
							}
						}
					}
				}
			}
		}
	}
	int ans=0;
	for(int i=0;i<=n;i++){
		for(int j=0;j<=n;j++){
			for(int k=0;k<=n;k++){
				for(int l=0;l<=3;l++){
					int ccc=n+1-i-j-k,tmp=(j-1)*j/2+(k-1)*k/2+(l-1)*l/2+ccc*(ccc-1)/2;
					if(tmp>=kk)ans+=dp[n&1][i][j][k][l];
//					cout<<ans<<endl;
				}
			}
		}
	}
	cout<<ans;
	return 0;
}

2024/12/29 20:42
加载中...