【LOJ】#3123. 「CTS2019 | CTSC2019」重复
LOJ3123
60pts
正难则反,熟练转成总方案数减掉每个片段都大于等于s的字典序的方案
按照一般的套路建出kmp上每个点加一个字符的转移边的图(注意这个图开始字母必须是nxt链中下一个相邻的字符最大的一个,不然就字典序比它小了)
然后大力猜结论可能是走m步走出一个环的个数,很容易发现这是不漏的,因为一个串无限重复最后都会走出一个m步的(不一定是简单环的)环
不重的我没证出来,抱着试试看的心态我们写个极其简单的dp,发现它过了……
100pts
很容易发现每个点要么走到nxt链中下一个相邻字符中最大的一个,要么走到0
我们对于一个环可以分成经过0的和不经过0的
不经过0的从每个点开始走m步判断一下就可以
经过0的可以通过枚举每个点走了几步没到0的边然后走了一步到0
我们预处理出\(f[i][j]\)表示走了i步到达j点,枚举初始走了几步相乘即可
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define MAXN 2005
#define ba 47
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
const int MOD = 998244353;
int M,N,nxt[MAXN],to[MAXN][26],mx[MAXN];
int dp[MAXN][MAXN];
char s[MAXN];
int inc(int a,int b) {
return a + b >= MOD ? a + b - MOD : a + b;
}
int mul(int a,int b) {
return 1LL * a * b % MOD;
}
void update(int &x,int y) {
x = inc(x,y);
}
int fpow(int x,int c) {
int res = 1,t = x;
while(c) {
if(c & 1) res = mul(res,t);
t = mul(t,t);
c >>= 1;
}
return res;
}
void Solve() {
read(M);
scanf("%s",s + 1);
N = strlen(s + 1);
for(int i = 2 ; i <= N ; ++i) {
int p = nxt[i - 1];
while(p && s[i] != s[p + 1]) p = nxt[p];
if(s[i] == s[p + 1]) nxt[i] = p + 1;
else nxt[i] = 0;
}
for(int i = 0 ; i <= N ; ++i) {
mx[i] = mx[nxt[i]];
if(i != N) mx[i] = max(mx[i],s[i + 1] - 'a');
for(int j = 0 ; j < mx[i] ; ++j) to[i][j] = -1;
for(int j = mx[i] ; j < 26 ; ++j) {
if('a' + j == s[i + 1]) to[i][j] = i + 1;
else {
int p = nxt[i];
while(to[p][j] == -1) p = nxt[p];
to[i][j] = to[p][j];
}
}
}
int ans = 0;
dp[0][0] = 1;
for(int i = 0 ; i < M ; ++i) {
for(int j = 0 ; j <= N ; ++j) {
if(!dp[i][j]) continue;
for(int h = mx[j] ; h < 26 ; ++h) {
update(dp[i + 1][to[j][h]],dp[i][j]);
}
}
}
for(int i = 0 ; i <= N ; ++i) {
int u = i;
for(int j = 0 ; j < M ; ++j) {
update(ans,mul(25 - mx[u],dp[M - j - 1][i]));
u = to[u][mx[u]];
}
if(u == i) update(ans,1);
}
out(inc(fpow(26,M),MOD - ans));enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}
【LOJ】#3123. 「CTS2019 | CTSC2019」重复的更多相关文章
- Loj #3124. 「CTS2019 | CTSC2019」氪金手游
Loj #3124. 「CTS2019 | CTSC2019」氪金手游 题目描述 小刘同学是一个喜欢氪金手游的男孩子. 他最近迷上了一个新游戏,游戏的内容就是不断地抽卡.现在已知: - 卡池里总共有 ...
- LOJ 3124 「CTS2019 | CTSC2019」氪金手游——概率+树形DP
题目:https://loj.ac/problem/3124 看了题解:https://www.cnblogs.com/Itst/p/10883880.html 先考虑外向树. 考虑分母是 \( \s ...
- LOJ #3119「CTS2019 | CTSC2019」随机立方体 (容斥)
博客链接 里面有个下降幂应该是上升幂 还有个bk的式子省略了k^3 CODE 蛮短的 #include <bits/stdc++.h> using namespace std; const ...
- LOJ #3119. 「CTS2019 | CTSC2019」随机立方体 组合计数+二项式反演
好神的一道计数题呀. code: #include <cstdio> #include <algorithm> #include <cstring> #define ...
- @loj - 3120@ 「CTS2019 | CTSC2019」珍珠
目录 @description@ @solution@ @accepted code@ @details@ @description@ 有 \(n\) 个在范围 \([1, D]\) 内的整数均匀随机 ...
- 「CTS2019 | CTSC2019」氪金手游 解题报告
「CTS2019 | CTSC2019」氪金手游 降 智 好 题 ... 考场上签到失败了,没想容斥就只打了20分暴力... 考虑一个事情,你抽中一个度为0的点,相当于把这个点删掉了(当然你也只能抽中 ...
- 「CTS2019 | CTSC2019」随机立方体 解题报告
「CTS2019 | CTSC2019」随机立方体 据说这是签到题,但是我计数学的实在有点差,这里认真说一说. 我们先考虑一些事实 如果我们在位置\((x_0,y_0,z_0)\)钦定了一个极大数\( ...
- LOJ 3120: 洛谷 P5401: 「CTS2019 | CTSC2019」珍珠
题目传送门:LOJ #3120. 题意简述: 称一个长度为 \(n\),元素取值为 \([1,D]\) 的整数序列是合法的,当且仅当其中能够选出至少 \(m\) 对相同元素(不能重复选出元素). 问合 ...
- LOJ 3119: 洛谷 P5400: 「CTS2019 | CTSC2019」随机立方体
题目传送门:LOJ #3119. 题意简述: 题目说的很清楚了. 题解: 记恰好有 \(i\) 个极大的数的方案数为 \(\mathrm{cnt}[i]\),则答案为 \(\displaystyle\ ...
随机推荐
- JAVA实现四则运算的简单计算器
开发环境eclipse java neon. 今天用JAVA的swing界面程序设计制作了一个四则运算的简易计算器.代码以及截图如下: computer.java: ///////////////// ...
- 利用pyltp进行实体识别
一.实体识别作为信息抽取中基础的也是重要的一步,其技术可以分为三类,分别是其于规则的方法.其于统计模型的方法以及基于深度学习的方法. 基于规则的方法,主要依靠构建大量的实体抽取规则,一般由具有一定领域 ...
- Atcoder ABC138
Atcoder ABC138 A .Red or Not 一道网速题. 大于3200输出原字符串,否则就输出red. #include<iostream> #include<cstd ...
- 【洛谷4251】 [SCOI2015]小凸玩矩阵(二分答案,二分图匹配)
题面 传送门 Solution 看到什么最大值最小肯定二分啊. check直接跑一个二分图匹配就好了. orz ztl!!! 代码实现 /* mail: mleautomaton@foxmail.co ...
- django 快速实现登陆,接着注册的项目写(五)
1.改项目的urls.py from django.conf.urls import url,include from django.contrib import admin admin.autodi ...
- Redis 4.x RCE 复现学习
攻击场景: 能够访问远程redis的端口(直接访问或者SSRF) 对redis服务器可以访问到的另一台服务器有控制权 实际上就是通过主从特性来 同步传输数据,同时利用模块加载来加载恶意的用来进行命令执 ...
- Linux设备驱动程序 之 Makefile
典型的模块Makefile如下所示: ifneq ($(KERNELRELEASE),) obj-m := hello.o else KERNELDIR ?=/lib/modules/$(shell ...
- Filebeat使用
1.Beat家族 Beats可以直接(或者通过Logstash)将数据发送到Elasticsearch,在那里你可以进一步处理和增强数据,然后在Kibana中将其可视化. 2.FileBeat安装 2 ...
- 性能分析 | Linux 内存占用分析
这篇博客主要介绍 linux 环境下,查看内存占用的两种方式:使用 ps,top等命令:查看/proc/[pid]/下的文件.文章简要介绍了命令的使用方法与一些参数意义,同时对/proc/[pid]/ ...
- C#剪切生成高质量缩放图片
/// <summary> /// 高质量缩放图片 /// </summary> /// <param name="OriginFilePath"&g ...