Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
37974 | LYLAKIOI | 【S】T4 | C++ | 通过 | 100 | 755 MS | 62016 KB | 4535 | 2025-06-08 14:31:46 |
#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; pi g(string s){ int c0=0,c1=0,ca=0,cb=0; for(char ch:s){ c0+=ch=='a',c1+=ch=='b'; if(c0==2||c1==2)ca+=c0==2,cb+=c1==2,c0=c1=0; } return m_p(c0+c1,ca-cb); } int sgn(int x){ if(x>0)return 1; if(x<0)return -1; return 0; } int chk(string s){ auto A=g(s);s.insert(s.begin(),s.back()); auto B=g(s);s.insert(s.begin(),s[s.size()-2]); auto C=g(s); if(A.p1==0)return sgn(A.p2); if(A.p1==1){ if(B.p1==0)return sgn(A.p2+B.p2); if(B.p1==1)return sgn(B.p2); if(C.p1==1)return sgn(B.p2+C.p2); if(C.p1==2)return sgn(C.p2); return sgn(A.p2+B.p2+C.p2); } else { if(C.p1==2)return sgn(C.p2); if(C.p1==0)return sgn(A.p2+C.p2); if(B.p1==1)return sgn(B.p2); if(B.p1==2)return sgn(B.p2+C.p2); return sgn(A.p2+B.p2+C.p2); } } int c[3]; void dfs(int x){ if(x==n){ c[chk(s)+1]++; return; } if(s[x]=='?'){ s[x]='a';dfs(x+1); s[x]='b';dfs(x+1);s[x]='?'; }else dfs(x+1); } int dp[205][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][j][o1][o2][o3]); else if(j==P)Add(ans[1],dp[n][j][o1][o2][o3]); else Add(ans[2],dp[n][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; memset(dp,0,sizeof(dp)); dp[0][nw][o1][o2][o3]=1; up(i,1,n)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[i-1][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[i][jj][oo1][oo2][oo3],dp[i-1][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; }