CF1487G String Counting (容斥计数)

传送门

考虑$c[i]>n/3$这个关键条件!最多有2个字母数量超过$n/3$!

没有奇数回文?长度大于3的回文串中间一定是长度为3的回文串,所以合法串一定没有长度=3的回文,也就是$a[i]\ne a[i-2]$恒成立

考虑没有数目限制的情况,除了前两个位置,其它位置都只能填25种字母,答案是$26*26*25^{n-2}$

再容斥掉数量限制

对于单个字母,我们去掉$j>c[i]$这些情况

再枚举两个字母,加回来$j>c[i_{1}]$且$k>c[i_{2}]$这些情况

由于最多有2个字母超过$n/3$,设为$a$和$b$

维护$f(i,j,k,s,t)$表示长度为i的串中,放了j个a字母,k个b字母,i-1放了s,i放了t,s和t只有a/b/其它字母三种情况

大力讨论转移,滚动数组压空间

再维护$g(i,j,s,t)$表示长度为i的串中,放了j个a字母,i-1放了s,i放了t

原理同上

最麻烦的就是预处理,我比较蠢直接讨论n的奇偶做的

  1 const int N1=405; const ll p=998244353;
  2 
  3 ll qpow(ll x,ll y)
  4 {
  5     ll ans=1;
  6     for(;y;x=x*x%p,y>>=1) if(y&1) ans=ans*x%p;
  7     return ans;
  8 }
  9 int n,m;
 10 ll f[2][N1][N1][3][3],g[2][N1][2][2],sf[N1][N1],sg[N1];
 11 int a[N1];
 12 
 13 int main()
 14 {
 15     scanf("%d",&n);
 16     for(int i=1;i<=26;i++) scanf("%d",&a[i]);
 17     int now=1, pst=0, st;
 18     int j,k,s,t,u,v,x,y; 
 19     if(n&1){
 20         f[pst][0][0][0][0]=24; f[pst][1][0][0][1]=1; f[pst][0][1][0][2]=1; 
 21         for(j=0;j<=1;j++) for(k=0;j+k<=1;k++)
 22         {
 23             for(s=0,t=0;t<=2;t++) for(u=0;u<=2;u++) for(v=0;v<=2;v++)
 24             {
 25                 if(u) x=1; else x=24; 
 26                 if(v){ if(v==t) y=0; else y=1; }
 27                 else{ if(t) y=24; else y=23; }
 28                 if(u==0)
 29                 {
 30                     if(v==0) (f[now][j][k][u][v]+=f[pst][j][k][s][t]*x*y)%=p;
 31                     if(v==1) (f[now][j+1][k][u][v]+=f[pst][j][k][s][t]*x*y)%=p;
 32                     if(v==2) (f[now][j][k+1][u][v]+=f[pst][j][k][s][t]*x*y)%=p;
 33                 }
 34                 if(u==1)
 35                 {
 36                     if(v==0) (f[now][j+1][k][u][v]+=f[pst][j][k][s][t]*x*y)%=p;
 37                     if(v==1) (f[now][j+2][k][u][v]+=f[pst][j][k][s][t]*x*y)%=p;
 38                     if(v==2) (f[now][j+1][k+1][u][v]+=f[pst][j][k][s][t]*x*y)%=p;
 39                 }
 40                 if(u==2) 
 41                 {
 42                     if(v==0) (f[now][j][k+1][u][v]+=f[pst][j][k][s][t]*x*y)%=p;
 43                     if(v==1) (f[now][j+1][k+1][u][v]+=f[pst][j][k][s][t]*x*y)%=p;
 44                     if(v==2) (f[now][j][k+2][u][v]+=f[pst][j][k][s][t]*x*y)%=p;
 45                 }
 46             }
 47         }
 48         g[pst][0][0][0]=25; g[pst][1][0][1]=1; 
 49         for(j=0;j<=1;j++) 
 50         {
 51             for(s=0,t=0;t<=1;t++) for(u=0;u<=1;u++) for(v=0;v<=1;v++)
 52             {
 53                 if(u) x=1; else x=25;
 54                 if(v){ if(v==t) y=0; else y=1; }
 55                 else{ if(t) y=25; else y=24; }
 56                 if(u==0)
 57                 {
 58                     if(v==0) (g[now][j][u][v]+=g[pst][j][s][t]*x*y)%=p;
 59                     if(v==1) (g[now][j+1][u][v]+=g[pst][j][s][t]*x*y)%=p;
 60                 }
 61                 if(u==1)
 62                 {
 63                     if(v==0) (g[now][j+1][u][v]+=g[pst][j][s][t]*x*y)%=p;
 64                     if(v==1) (g[now][j+2][u][v]+=g[pst][j][s][t]*x*y)%=p;
 65                 }
 66             }
 67         }
 68         st=3; swap(pst,now);
 69     }else{
 70         f[pst][0][0][0][0]=24*24; f[pst][1][0][1][0]=24; f[pst][0][1][2][0]=24;
 71         f[pst][1][0][0][1]=24;    f[pst][2][0][1][1]=1;  f[pst][1][1][2][1]=1; 
 72         f[pst][0][1][0][2]=24;    f[pst][1][1][1][2]=1;  f[pst][0][2][2][2]=1;
 73         g[pst][0][0][0]=25*25; g[pst][1][1][0]=25; g[pst][1][0][1]=25; g[pst][2][1][1]=1; 
 74         st=2;
 75     }
 76     for(int i=st+2;i<=n;i+=2)
 77     {
 78         memset(f[now],0,sizeof(f[now]));
 79         for(j=0;j<=i;j++) for(k=0;j+k<=i;k++)
 80         {
 81             for(s=0;s<=2;s++) for(t=0;t<=2;t++) for(u=0;u<=2;u++) for(v=0;v<=2;v++)
 82             {
 83                 if(u){ if(u==s) x=0; else x=1; }
 84                 else{ if(s) x=24; else x=23; }
 85                 if(v){ if(v==t) y=0; else y=1; }
 86                 else{ if(t) y=24; else y=23; }
 87                 if(u==0)
 88                 {
 89                     if(v==0) (f[now][j][k][u][v]+=f[pst][j][k][s][t]*x*y)%=p;
 90                     if(v==1) (f[now][j+1][k][u][v]+=f[pst][j][k][s][t]*x*y)%=p;
 91                     if(v==2) (f[now][j][k+1][u][v]+=f[pst][j][k][s][t]*x*y)%=p;
 92                 }
 93                 if(u==1)
 94                 {
 95                     if(v==0) (f[now][j+1][k][u][v]+=f[pst][j][k][s][t]*x*y)%=p;
 96                     if(v==1) (f[now][j+2][k][u][v]+=f[pst][j][k][s][t]*x*y)%=p;
 97                     if(v==2) (f[now][j+1][k+1][u][v]+=f[pst][j][k][s][t]*x*y)%=p;
 98                 }
 99                 if(u==2) 
100                 {
101                     if(v==0) (f[now][j][k+1][u][v]+=f[pst][j][k][s][t]*x*y)%=p;
102                     if(v==1) (f[now][j+1][k+1][u][v]+=f[pst][j][k][s][t]*x*y)%=p;
103                     if(v==2) (f[now][j][k+2][u][v]+=f[pst][j][k][s][t]*x*y)%=p;
104                 }
105             }
106         }
107         memset(g[now],0,sizeof(g[now]));
108         for(j=0;j<=i;j++) 
109         {
110             for(s=0;s<=1;s++) for(t=0;t<=1;t++) for(u=0;u<=1;u++) for(v=0;v<=1;v++)
111             {
112                 if(u){ if(u==s) x=0; else x=1; }
113                 else{ if(s) x=25; else x=24; }
114                 if(v){ if(v==t) y=0; else y=1; }
115                 else{ if(t) y=25; else y=24; }
116                 if(u==0)
117                 {
118                     if(v==0) (g[now][j][u][v]+=g[pst][j][s][t]*x*y)%=p;
119                     if(v==1) (g[now][j+1][u][v]+=g[pst][j][s][t]*x*y)%=p;
120                 }
121                 if(u==1)
122                 {
123                     if(v==0) (g[now][j+1][u][v]+=g[pst][j][s][t]*x*y)%=p;
124                     if(v==1) (g[now][j+2][u][v]+=g[pst][j][s][t]*x*y)%=p;
125                 }
126             }
127         }
128         swap(now,pst);
129     }
130     
131     for(j=1;j<=n;j++) for(k=1;k<=n;k++)
132     {
133         for(s=0;s<=2;s++) for(t=0;t<=2;t++)
134             (sf[j][k]+=f[pst][j][k][s][t])%=p;
135     }
136     for(int j=n;j>=1;j--) for(k=n;k>=1;k--)
137         sf[j][k]=(sf[j][k]+sf[j+1][k]+sf[j][k+1]-sf[j+1][k+1]+p)%p;
138     for(j=1;j<=n;j++) for(s=0;s<=1;s++) for(t=0;t<=1;t++)
139             (sg[j]+=g[pst][j][s][t])%=p;
140     for(j=n;j>=1;j--) (sg[j]+=sg[j+1])%=p;
141     m=n/3;
142     ll ans=qpow(25ll,n-2)*26*26%p;
143     for(s=1;s<=26;s++) ans=(ans-sg[a[s]+1]+p)%p;
144     for(s=1;s<=26;s++) for(t=s+1;t<=26;t++) 
145         ans=(ans+sf[a[s]+1][a[t]+1])%p;
146     printf("%lld\n",ans);
147     return 0;
148 }
View Code

 

posted @ 2021-02-25 11:02  guapisolo  阅读(106)  评论(0编辑  收藏  举报