正题

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


题目大意

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

1≤∣S∣,m≤20001\leq |S|,m\leq 20001≤∣S∣,m≤2000


解题思路

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

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

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

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

暴力枚举节点来dpdpdp肯定是会TTT,考虑优化一下。

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

所以设fi,jf_{i,j}fi,j​表示从000出发走jjj步到达iii的方案数。

然后对于起点枚举多少步后走到000再用fff统计答案就好了。

时间复杂度O(nm)O(nm)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. HDU - 4552 怪盗基德的挑战书(后缀数组+RMQ/KMP+dp)

    题目链接:点击查看 题目大意:给出一个字符串,统计每个前缀在字符串中出现的次数之和 题目分析:可以直接先用后缀数组跑出来height,再用RMQ跑出来任意两个后缀的height,我们可以将题意转换为求 ...

  2. HDU5763 Another Meaning(KMP+dp)

    题意: 给你一个主串一个子串,然后主串中匹配到子串就可以把当前部分改为*, 问主串有多少中不同的样子 思路: 先KMP预处理主串中所有匹配到子串的末尾位置 然后用dp dp[N][2]只更新成功匹配的 ...

  3. 2017 Multi-University Training Contest - Team 4:1002. Classic Quotation(KMP+DP)

    题意:给你两个字符串S和T,每次询问(L, R)求出所有满足x<=L, y>=R的(x, y),S串的前x个字符和后y个字符接在一起后包含字符串T的个数之和 说实话..这题会做题解也还是看 ...

  4. BZOJ 1009: [HNOI2008]GT考试(kmp+dp+矩阵优化)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1009 题意: 思路: 真的是好题啊! 对于这种题目,很有可能就是dp,$f[i][j]$表示分析到第 ...

  5. [HDU3336]Count the string(KMP+DP)

    Solution 不稳定的传送门 对KMP的灵活应用 设dp[i]表示前[1,i]的答案 那么dp[i]=dp[p[i]]+1,p[i]为失配函数 Code #include <cstdio&g ...

  6. 牛客 - Connie(AC自动机+dp/KMP+dp)

    题目链接:点击查看 题目大意:给出一个匹配串 sss,现在问模式串 ttt 的期望得分.其中假设匹配串在模式串中的出现次数为 xxx,那么将得到 2x2^x2x 的分数 题目分析:涉及到了期望一开始还 ...

  7. hdu3689(kmp+dp)

    题意:问随机生成一个长度为m(m<=1000)长度的字符串,出现某个子串s的概率是多少. 解法:dp+kmp优化.ans[i][j]表示i长度,走到了s的j位置的概率,当然这是在i之前没有出现s ...

  8. Codeforces 432D Prefixes and Suffixes(KMP+dp)

    题目连接:Codeforces 432D Prefixes and Suffixes 题目大意:给出一个字符串,求全部既是前缀串又是后缀串的字符串出现了几次. 解题思路:依据性质能够依据KMP算法求出 ...

  9. HDU 5763 Another Meaning KMP+DP

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5763 Another Meaning Time Limit: 2000/1000 MS (Java/ ...

最新文章

  1. Glossary in Turbulence
  2. 矩阵y=wx+b 位置
  3. 程序员面试题精选100题(07)-翻转句子中单词的顺序[算法]
  4. Thymeleaf——在不覆盖现有class属性的情况下动态添加CSS class解决方案
  5. boost之timer,progress_timer,progress_display的介绍及使用
  6. 为什么不应该用Stream forEach替换for循环的3个原因
  7. mui HTML5plus 批量上传文件
  8. 创业失败三年后,这个曾经的富二代变得一无所有
  9. python票务系统_列车票务系统
  10. E/MediaPlayer: Should have subtitle controller already set
  11. 中文信息处理(二)—— 分词
  12. AWT_Swing_初始化(Java)
  13. 计算机如何共享手机网络热点,手机也能做热点 教你如何共享手机3G网
  14. OBS+SRS+centos7搭建局域网直播推流服务器
  15. UltraISO和rufus制作服务器U启动和下载步骤
  16. 黑色炫酷网址安全跳转GO跳转PHP源码
  17. Y430P 重装Ubuntu16.04双系统以及装完系统要做的事
  18. Laravel表单验证,优雅一点的写法,控制器里面不要写太多东西,
  19. 有苦有乐的算法 --- 二叉树的按层遍历
  20. 2021.10.12-13科研日志

热门文章

  1. linux运维趋势 37期刊为啥没有,linux运维常见问题
  2. php正则过滤html标签_空格_换行符的代码,PHP 正则过滤 html 标签、空格、换行符的代码 (文章格式化)...
  3. 京瓷1020怎么打印自检页_[建筑]喷墨打印机如何打印自检页 详细
  4. 嵌入式linux pcie网卡配置,嵌入式Linux下PCIE数据采集卡驱动开发
  5. leetcode90. 子集 II
  6. 你知道304吗?图解强缓存和协商缓存
  7. [Java基础]IO流小结
  8. [Java基础]final和static修饰符
  9. C++ class实现双亲表示法
  10. [蓝桥杯][2013年第四届真题]幸运数-模拟+dfs