#include #include using namespace std; using namespace atcoder; typedef long long int ll; typedef long double ld; typedef vector vi; typedef vector vl; typedef vector vvl; typedef vector vvvl; typedef vector vvvvl; typedef vector vb; typedef vector vvb; typedef vector vvvb; typedef vector vvvvb; typedef pair pl; typedef pair ppl; typedef pair pppl; typedef pair pppppl; #define rep(i,a,b) for(int i=(a);i<(b);i++) #define rrep(i,a,b) for(int i=(b)-1;i>=(a);i--) #define all(a) begin(a),end(a) #define sz(a) (int)(a).size() #define F first #define S second #define bs(A,x) binary_search(all(A),x) #define lb(A,x) (ll)(lower_bound(all(A),x)-A.begin()) #define ub(A,x) (ll)(upper_bound(all(A),x)-A.begin()) #define cou(A,x) (ll)(upper_bound(all(A),x)-lower_bound(all(A),x)) templateusing min_priority_queue=priority_queue,greater>; templatebool chmax(T&a,T b){if(abool chmin(T&a,T b){if(b vm; typedef vector vvm; typedef vector vvvm; typedef vector vvvvm; ostream&operator<<(ostream&os,mint a){os<>(istream&is,mint&a){int x;is>>x;a=mint(x);return is;} //*/ templateostream&operator<<(ostream&os,pairp){os<istream&operator>>(istream&is,pair&p){is>>p.F>>p.S;return is;} templateostream&operator<<(ostream&os,vectorv){rep(i,0,sz(v))os<istream&operator>>(istream&is,vector&v){for(T&in:v)is>>in;return is;} int main(){ cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.failbit); string S;cin>>S; ll N=sz(S); vl A(N+1),B(N+1); rep(i,0,N)A[i+1]=A[i]+(S[i]=='A'); rep(i,0,N)B[i+1]=B[i]+(S[i]=='B'); vm ex(2e6,1),re(2e6); rep(i,1,2e6)ex[i]=i*ex[i-1]; rep(i,0,2e6)re[i]=1/ex[i]; //https://kanpurin.hatenablog.com/entry/2021/09/15/220913#aruryoiki functiondc=[&](ll l,ll r,vm&bottom){ if(r-l==1){ if(S[l]=='A')return vm{bottom[1]}; else return vm{bottom[0],bottom[0]}; } ll m=(l+r)/2; vm left(A[m]-A[l]+1),right(A[r]-A[m]+1); rep(i,A[l],A[m]+1)left[i-A[l]]=bottom[i-A[l]]; rep(i,A[m],A[r]+1)right[i-A[m]]=bottom[i-A[l]]; auto X=dc(l,m,left); ll H=sz(X)-1,W=sz(right)-1; vm top(W+1),res(H+1); res[0]=right[W]; top[0]=X[H]; X[0]=right[0]=0; if(W==0)rep(i,1,H+1)res[i]=X[i]; else{ vm F(H+1); rep(i,0,H+1)F[i]=ex[i+W-1]*re[W-1]*re[i]; auto G=convolution(X,F); rep(i,1,H+1)res[i]+=G[i]; rep(i,0,H+W+1)F[i]=ex[i]; rep(i,0,W+1)right[i]*=re[W-i]; G=convolution(F,right); rep(i,0,W+1)right[i]*=ex[W-i]; rep(i,1,H+1)res[i]+=re[i-1]*G[i+W-1]; } swap(H,W); swap(X,right); if(W==0)rep(i,1,H+1)top[i]=X[i]; else{ vm F(H+1); rep(i,0,H+1)F[i]=ex[i+W-1]*re[W-1]*re[i]; auto G=convolution(X,F); rep(i,1,H+1)top[i]+=G[i]; rep(i,0,H+W+1)F[i]=ex[i]; rep(i,0,W+1)right[i]*=re[W-i]; G=convolution(F,right); rep(i,0,W+1)right[i]*=ex[W-i]; rep(i,1,H+1)top[i]+=re[i-1]*G[i+W-1]; } auto Y=dc(m,r,top); Y.erase(Y.begin()); res.insert(res.end(),all(Y)); return res; }; vm bottom(A[N]+1,1); auto ans=dc(0,N,bottom); cout<