abc的g题,求卡常/kk
  • 板块学术版
  • 楼主ran_qwq
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/11/9 22:37
  • 上次更新2024/11/10 09:56:45
查看原帖
abc的g题,求卡常/kk
743048
ran_qwq楼主2024/11/9 22:37
#include<bits/stdc++.h>
#define il inline
#define ui unsigned int
#define ll long long
#define ull unsigned ll
#define lll __int128
#define db double
#define ldb long double
#define pii pair<int,int>
#define vi vector<int>
#define vpii vector<pii>
#define fir first
#define sec second
#define gc getchar
#define pc putchar
#define mst(a,x) memset(a,x,sizeof a)
#define mcp(a,b) memcpy(a,b,sizeof b)
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define pct __builtin_popcount
using namespace std;
const int N=210,M=15,K=5e6+10,INF=0x3f3f3f3f,MOD=998244353; const ll INFll=0x3f3f3f3f3f3f3f3f;
il int rd() {int x=0,f=1; char ch=gc(); while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=gc();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc(); return x*f;}
il ll rdll() {ll x=0; int f=1; char ch=gc(); while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=gc();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc(); return x*f;}
il void wr(int x) {if(x==INT_MIN) return printf("-2147483648"),void(); if(x<0) return pc('-'),wr(-x); if(x<10) return pc(x+'0'),void(); wr(x/10),pc(x%10+'0');}
il void wrll(ll x) {if(x==LLONG_MIN) return printf("-9223372036854775808"),void(); if(x<0) return pc('-'),wrll(-x); if(x<10) return pc(x+'0'),void(); wrll(x/10),pc(x%10+'0');}
il void wr(int x,char *s) {wr(x),printf("%s",s);}
il void wrll(ll x,char *s) {wrll(x),printf("%s",s);}
il int vmod(int x) {return x>=MOD?x-MOD:x;}
il int vadd(int x,int y) {return vmod(x+y);}
il int vsub(int x,int y) {return vmod(x-y+MOD);}
il int vmul(int x,int y) {return 1ll*x*y%MOD;}
il int qpow(int x,int y) {int res=1; for(;y;y>>=1,x=vmul(x,x)) if(y&1) res=vmul(res,x); return res;}
il void cadd(int &x,int y) {x=vmod(x+y);}
il void csub(int &x,int y) {x=vmod(x-y+MOD);}
il void cmul(int &x,int y) {x=vmul(x,y);}
il void cmax(int &x,int y) {x<y&&(x=y);}
il void cmaxll(ll &x,ll y) {x<y&&(x=y);}
il void cmin(int &x,int y) {x>y&&(x=y);}
il void cminll(ll &x,ll y) {x>y&&(x=y);}
int n,m,rs,pw[M],dp[K],lst[K],gt[K][M]; char _ch[N][N],ch[N][M];
void QwQ() {
	n=rd(),m=rd();
	for(int i=1;i<=n;i++) scanf("%s",_ch[i]+1);
	if(n>m) for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) ch[i][j]=_ch[i][j];
	else {swap(n,m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) ch[i][j]=_ch[j][i];}
	pw[0]=1; for(int i=1;i<=m;i++) pw[i]=pw[i-1]*3;
	for(int s=0,fg;s<pw[m];s++) {
		for(int i=1;i<=m;i++) gt[s][i]=s/pw[i-1]%3;
		fg=1; for(int i=1;i<=m;i++) fg&=(i==1||gt[s][i-1]!=gt[s][i])&&(ch[1][i]=='?'||ch[1][i]-'1'==gt[s][i]);
		dp[s]=lst[s]=fg;
	}
	for(int i=2;i<=n;i++) for(int j=1;j<=m;j++) {
		for(int s=0,c;s<pw[m];s++) {
			dp[s]=0,c=gt[s][j];
			if(j==1||c!=gt[s][j-1]) {
				if(!c&&(ch[i][j]=='?'||ch[i][j]=='1')) cadd(dp[s],vadd(lst[s+pw[j-1]],lst[s+2*pw[j-1]]));
				else if(c==1&&(ch[i][j]=='?'||ch[i][j]=='2')) cadd(dp[s],vadd(lst[s-pw[j-1]],lst[s+pw[j-1]]));
				else if(c==2&&(ch[i][j]=='?'||ch[i][j]=='3')) cadd(dp[s],vadd(lst[s-2*pw[j-1]],lst[s-pw[j-1]]));
			}
		}
		for(int s=0;s<pw[m];s++) lst[s]=dp[s];
	}
	for(int i=0;i<pw[m];i++) cadd(rs,dp[i]); wr(rs,"\n");
}
signed main() {
//	freopen("in.in","r",stdin),freopen("out.out","w",stdout);
	int T=1; while(T--) QwQ();
}

卡了好久都是TLE *7。。

思路是从上往下从左往右填,记录每列已填的最后一行

2024/11/9 22:37
加载中...