提交时间:2025-06-08 21:39:34
运行 ID: 38020
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; const int mod=998244353; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } string s; int n; int dp[2][1205][4][4][4]; int ans[3];int P; inline void Add(int &a,int b){if((a+=b)>=mod)a-=mod;} void op(int j,int o1,int o2,int o3){ if(j>P)Add(ans[0],dp[n&1][j][o1][o2][o3]); else if(j==P)Add(ans[1],dp[n&1][j][o1][o2][o3]); else Add(ans[2],dp[n&1][j][o1][o2][o3]); } void slv(){ cin>>s,n=s.size();s=" "+s; P=n*3; up(c1,'a','b')up(c2,'a','b')up(S,1,7){ if(s[n-1]!='?'&&s[n-1]!=c1)continue; if(s[n]!='?'&&s[n]!=c2)continue; int nw=P,o1=0,o2=0,o3=0; if(S&4)if(c1==c2)nw+=(c1=='a')?1:-1; if(c2=='a')o2=1; else o2=2; if(c1!=c2)o3=3; dp[0][nw][o1][o2][o3]=1; up(i,1,n){ int op=i&1; memset(dp[op],0,sizeof(dp[op])); up(c,'a','b'){ if(s[i]!='?'&&s[i]!=c)continue; if(i==n-1&&c!=c1)continue; if(i==n&&c!=c2)continue; up(j,0,2*P){ up(o1,0,3)up(o2,0,3)up(o3,0,3){ if(!dp[!op][j][o1][o2][o3])continue; int jj=j,oo1=o1,oo2=o2,oo3=o3; if(o1==3)jj+=((c=='a')?1:-1)*bool(S&1),oo1=0; else if(o1==1){if(c=='a')jj+=bool(S&1),oo1=0;else oo1=3;} else if(o1==2){if(c=='b')jj-=bool(S&1),oo1=0;else oo1=3;} else oo1=(c=='a')?1:2; if(o2==3)jj+=((c=='a')?1:-1)*bool(S&2),oo2=0; else if(o2==1){if(c=='a')jj+=bool(S&2),oo2=0;else oo2=3;} else if(o2==2){if(c=='b')jj-=bool(S&2),oo2=0;else oo2=3;} else oo2=(c=='a')?1:2; if(o3==3)jj+=((c=='a')?1:-1)*bool(S&4),oo3=0; else if(o3==1){if(c=='a')jj+=bool(S&4),oo3=0;else oo3=3;} else if(o3==2){if(c=='b')jj-=bool(S&4),oo3=0;else oo3=3;} else oo3=(c=='a')?1:2; Add(dp[op][jj][oo1][oo2][oo3],dp[!op][j][o1][o2][o3]); } } } } if(S==1)up(j,0,2*P)up(o1,0,0)up(o2,0,3)up(o3,0,3)op(j,o1,o2,o3); if(S==2)up(j,0,2*P)up(o1,1,2)up(o2,1,2)up(o3,0,3)op(j,o1,o2,o3); if(S==2)up(j,0,2*P)up(o1,3,3)up(o2,1,2)up(o3,1,2)op(j,o1,o2,o3); if(S==3)up(j,0,2*P)up(o1,1,2)up(o2,0,0)up(o3,0,3)op(j,o1,o2,o3); if(S==4)up(j,0,2*P)up(o1,3,3)up(o2,0,3)up(o3,3,3)op(j,o1,o2,o3); if(S==4)up(j,0,2*P)up(o1,1,2)up(o2,3,3)up(o3,3,3)op(j,o1,o2,o3); if(S==5)up(j,0,2*P)up(o1,3,3)up(o2,0,3)up(o3,0,0)op(j,o1,o2,o3); if(S==6)up(j,0,2*P)up(o1,1,2)up(o2,3,3)up(o3,1,2)op(j,o1,o2,o3); if(S==6)up(j,0,2*P)up(o1,3,3)up(o2,3,3)up(o3,1,2)op(j,o1,o2,o3); if(S==7)up(j,0,2*P)up(o1,1,2)up(o2,3,3)up(o3,0,0)op(j,o1,o2,o3); if(S==7)up(j,0,2*P)up(o1,3,3)up(o2,0,0)up(o3,1,2)op(j,o1,o2,o3); } up(i,0,2)printf("%d\n",ans[i]); } int main(){ //freopen("comp.in","r",stdin),freopen("comp.out","w",stdout); slv(); return 0; }