传送门

考虑$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 }

CF1487G String Counting (容斥计数)的更多相关文章

  1. 【BZOJ 4455】 [Zjoi2016]小星星 容斥计数

    dalao教导我们,看到计数想容斥……卡常策略:枚举顺序.除去无效状态.(树结构) #include <cstdio> #include <cstring> #include ...

  2. 数学(容斥计数):LNOI 2016 方

    Description 上帝说,不要圆,要方,于是便有了这道题.由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形 上帝把我们派到了一个有N行M列的方格图上,图上一共有(N+1)×(M+1) ...

  3. AGC 005D.~K Perm Counting(容斥 DP 二分图)

    题目链接 \(Description\) 给定\(n,k\),求 满足对于所有\(i\),\(|a_i-i|\neq k\)的排列的个数. \(2\leq n\leq 2000,\quad 1\leq ...

  4. Codeforces.997C.Sky Full of Stars(容斥 计数)

    题目链接 那场完整的Div2(Div1 ABC)在这儿.. \(Description\) 给定\(n(n\leq 10^6)\),用三种颜色染有\(n\times n\)个格子的矩形,求至少有一行或 ...

  5. 一本通 1783 矩阵填数 状压dp 容斥 计数

    LINK:矩阵填数 刚看到题目的时候感觉是无从下手的. 可以看到有n<=2的点 两个矩形. 如果只有一个矩形 矩形外的方案数容易计算考虑 矩形内的 必须要存在x这个最大值 且所有值<=x. ...

  6. 【BZOJ 4818】 4818: [Sdoi2017]序列计数 (矩阵乘法、容斥计数)

    4818: [Sdoi2017]序列计数 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 560  Solved: 359 Description Al ...

  7. Co-prime HDU - 4135_容斥计数

    Code: #include<cstdio> #include<cstring> #include<cmath> #include<iostream> ...

  8. How many integers can you find HDU - 1796_容斥计数

    Code: #include<cstdio> using namespace std; typedef long long ll; const int R=13; ll a[R]; ll ...

  9. Comet OJ - Contest #2 (D 错综的光影所迷惑的思念是) 容斥计数

    题意:给定一颗 $n$ 个节点的树,定义 $dis(x,y)$ 为树上点 $x$ 到 $y$ 的路径经过的边数. 定义一个点集 $S$ 的 $f(S)$ 为 $f(S)=max\left \{dis( ...

随机推荐

  1. 【曹工杂谈】Mysql-Connector-Java时区问题的一点理解--写入数据库的时间总是晚13小时问题

    背景 去年写了一篇"[曹工杂谈]Mysql客户端上,时间为啥和本地差了整整13个小时,就离谱",结果最近还真就用上了. 不是我用上,是组内一位同事,他也是这样:有个服务往数据库in ...

  2. MyBatis中执行器Executor框架

    与JDK提供的Executor框架类似,MyBatis也提供了一套Executor框架,具体如下图: 其为Mybatis提供与数据库交互的功能,是一个典型的装饰器模式的应用--对JDBC功能的封装,同 ...

  3. 图解python | 安装与环境设置

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/56 本文地址:http://www.showmeai.tech/article-det ...

  4. Java 使用jcifs读写共享文件夹报错jcifs.smb.SmbException: Failed to connect: 0.0.0.0<00>/10.1.*.*

    Q:使用jcifs读写Windows 10 共享文件夹中的文件报jcifs.smb.SmbException: Failed to connect: 0.0.0.0<00>/10.1.*. ...

  5. 关于WebStorm-React-Native 代码提示安装方法

    声明 本方法 为网上好心人提供  我提供整理 插件名称:Webstrom live template 安装方法一:1.打开终端输入 git clone https://github.com/virto ...

  6. CobaltStrike逆向学习系列(14):CS功能分析-DotNet

    这是[信安成长计划]的第 14 篇文章 0x00 目录 0x01 DotNet功能分析 0x02 DotNet功能执行 0x03 写在最后 在上两篇文章中,讲述了 CS 中的一种功能执行方式 RDI, ...

  7. 正确理解jmeter线程组之Ramp-Up

    Ramp-Up表示多少时间内启动线程,比如线程数100,Ramp-Up设置为10,表示10秒内启动100线程,不一定是每秒启动10个线程: 下面我们来做几个测试 线程组设置:100线程,Ramp-Up ...

  8. 分析CC攻击以及防御

    实验目的 了解DDoS攻击原理,及一个DDoS攻击的过程 实验内容 了解DDoS攻击原理,及一个DDoS攻击的过程 实验环境描述 1. 学生机与实验室网络直连: 2. VPC1与实验室网络直连: 3. ...

  9. 【C# 集合】HashTable .net core 中的Hashtable的实现原理

    上一篇我介绍了Hash函数 这篇我来说一下Hash函数在 HashTable中的应用. HashTable的特性: 1.装载因子:.net core 0.72 ,java 0.75 2.冲突解决方案: ...

  10. Typora简单使用

    Typora介绍 Typora是一款轻量级的Markdown编辑器,它没有采用传统编辑器那样源代码和预览双栏显示的方式,让你所见即所得,能够及时预览.目前Typora在IT领域的人气极高,这也致使原来 ...