正题

题目链接:https://www.luogu.com.cn/problem/P5404


题目大意

给出一个字符串\(S\),然后求有多少个长度为\(m\)的串\(T\)满足。无限多个串\(T\)拼接起来后能找出一个长度和\(S\)相等的子串字典序比\(S\)小。

\(1\leq |S|,m\leq 2000\)


解题思路

首先有一个小于的很难找,所以我们找有多少一直大于等于的减去就好了。

然后其实如果有一个大于位置大于\(S\)串匹配就可以直接不管,所以其实我们主要考虑前面都相等的情况,(根据题解)考虑用\(KMP\)。

设我们现在匹配到\([1,k]\),然后有\([1,nxt_k]=[k-nxt_k+1,k]\),然后加了一个字符如果有跳的边而且是转移边里面字符最大的,因为我们显然需要匹配出一个最大的前缀不然不能保证有小于的时候能直接找到。

而且如果我们现在在\(KMP\)上走了\(T^{\infty}\)之后节点是\(i\),那么\(T^{\infty}T\)也是会匹配回到节点\(i\)的,所以相当于我们要找一个节点\(p\)使得它匹配了\(T\)之后仍然是回到节点\(p\)。

暴力枚举节点来\(dp\)肯定是会\(T\),考虑优化一下。

不难发现如果一个点走\(m\)步之后没有回到过\(0\)号节点的话方案只有一种(因为每个点连接\(0\)以外的出边最多只有一条)。

所以设\(f_{i,j}\)表示从\(0\)出发走\(j\)步到达\(i\)的方案数。

然后对于起点枚举多少步后走到\(0\)再用\(f\)统计答案就好了。

时间复杂度\(O(nm)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=2100,P=998244353;
ll n,m,ans,nxt[N],ch[N][26],f[N][N],mx[N];
char s[N];
signed main()
{
scanf("%lld%s",&m,s+1);
n=strlen(s+1);ans=1;
for(ll i=1;i<=m;i++)ans=ans*26ll%P;
for(ll i=2,j=0;i<=n;i++){
while(j&&s[i]!=s[j+1])j=nxt[j];
j+=(s[i]==s[j+1]);nxt[i]=j;
}
for(ll i=0;i<=n;i++)
for(ll c=0;c<26;c++){
if(s[i+1]==c+'a')ch[i][c]=i+1;
else ch[i][c]=ch[nxt[i]][c];
if(ch[i][c])mx[i]=c;
}
f[0][0]=1;
for(ll i=0;i<m;i++)
for(ll j=0;j<=n;j++)
for(ll c=mx[j];c<26;c++)
(f[ch[j][c]][i+1]+=f[j][i])%=P;
for(ll i=0;i<=n;i++){
ll x=i;
for(ll j=1;j<=m;j++){
(ans-=(25-mx[x])*f[i][m-j]%P)%=P;
x=ch[x][mx[x]];
if(!x)break;
}
if(i&&x==i)(ans+=P-1)%=P;
}
printf("%lld\n",(ans+P)%P);
return 0;
}

P5404-[CTS2019]重复【KMP,dp】的更多相关文章

  1. LOJ3123 CTS2019 重复 KMP自动机、DP、多项式求逆

    传送门 CTS的计数题更完辣(撒花 Orz zx2003,下面的内容在上面的博客基础上进行一定的补充. 考虑计算无限循环之后不存在子串比\(s\)字典序小的串的个数.先对串\(s\)建立KMP自动机, ...

  2. [HDOJ5763]Another Meaning(KMP, DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5763 题意:给定两个字符串a和b,其中a中的字符串如果含有子串b,那么那部分可以被替换成*.问有多少种 ...

  3. POJ 3336 Count the string (KMP+DP,好题)

    参考连接: KMP+DP: http://www.cnblogs.com/yuelingzhi/archive/2011/08/03/2126346.html 另外给出一个没用dp做的:http:// ...

  4. 【KMP+DP】Count the string

    KMP算法的综合练习 DP很久没写搞了半天才明白.本题结合Next[]的意义以及动态规划考察对KMP算法的掌握. Problem Description It is well known that A ...

  5. codeforces432D Prefixes and Suffixes(kmp+dp)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud D. Prefixes and Suffixes You have a strin ...

  6. [kmp+dp] hdu 4628 Pieces

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4622 Reincarnation Time Limit: 6000/3000 MS (Java/Ot ...

  7. 洛谷P3193 [HNOI2008]GT考试 kmp+dp

    正解:kmp+dp+矩阵优化 解题报告: 传送门! 啊刚说想做矩阵优化dp的字符串题就找到辣QwQ虽然不是AC自动机的但都差不多嘛QwQ 首先显然可以想到一个dp式?就f[i][j]:凑出i位了,在s ...

  8. [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂)

    [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂) 题面 阿申准备报名参加GT考试,准考证号为N位数X1X2-.Xn,他不希望准考证号上出现不吉利的数字.他的不吉利数学A ...

  9. HDU 6153 A Secret ( KMP&&DP || 拓展KMP )

    题意 : 给出两个字符串,现在需要求一个和sum,考虑第二个字符串的所有后缀,每个后缀对于这个sum的贡献是这个后缀在第一个字符串出现的次数*后缀的长度,最后输出的答案应当是 sum % 1e9+7 ...

  10. 2021.11.09 P3426 [POI2005]SZA-Template(KMP+DP)

    2021.11.09 P3426 [POI2005]SZA-Template(KMP+DP) https://www.luogu.com.cn/problem/P3426 题意: 你打算在纸上印一串字 ...

随机推荐

  1. 【mysql】mysql简介及高手是如何练成的

    1.什么是mysql  MySQL 是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于Oracle 公司. Mysql 是开源的,可以定制的,采用了GPL 协议,你可以修改源码 ...

  2. 刷题-力扣-122. 买卖股票的最佳时机 II

    122. 买卖股票的最佳时机 II 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell ...

  3. Faiss使用多线程出现的性能问题

    Faiss使用多线程出现的性能问题 faiss在增加CPU的情况下,反而出现效率低下的问题. 从理论上看,作为一个CPU/GPU计算型的应用,更多的核意味着更大的计算吞吐能力,性能只会越来越好才是. ...

  4. Ubuntu16.04 Linux 下无痛安装、配置Gogs

    本文在Win7+VMware的ubuntu 16.04中测试,安装Gogs,Install from binary. 准备工作: sudo apt-get install git sudo addus ...

  5. MySQL双主+Keepalived高可用

    原文转自:https://www.cnblogs.com/itzgr/p/10233932.html作者:木二 目录 一 基础环境 二 实际部署 2.1 安装MySQL 2.2 初始化MySQL 2. ...

  6. 安全强化机制——SELinux

    1.基本 SELINUX 安全性概念 SELINUX(Security Enhanced Linux),意思是安全增强型Linux, 是可保护你系统安全性的额外机制 在某种程度上 , 它可以被看作是与 ...

  7. 前端搭建Linux云服务器,Nginx配置详解及部署自己项目到服务器上

    目录 搭建Linux云服务器 购买与基本配置 链接linux服务器 目录结构 基本命令 软件安装 Linux 系统启动 启动过程 运行级别 Nginx详解 1.安装 方式一:yum安装 方式二:自定义 ...

  8. Django——实现评论功能(包括评论回复)

    提示:(1)功能不全面,仅仅实现评论(2)样式简单 1.项目目录结构 2.模型 from django.db import models from django.contrib.auth.models ...

  9. NOIP模拟26「神炎皇·降雷皇·幻魔皇」

    T1:神炎皇   又是数学题,气死,根本不会.   首先考虑式子\(a+b=ab\),我们取\(a\)与\(b\)的\(gcd\):\(d\),那么式子就可以改写成: \[(a'+b')*d=a'b' ...

  10. docker日常使用指南

    docker日常使用指南 目录 docker日常使用指南 前言 1.基础知识 1.1 docker是什么 1.2 与虚拟机(VM)的区别 1.3 镜像与容器 2.安装 2.1 在线安装 2.2 离线安 ...