首页 > 其他分享 >KMP+状态转移

KMP+状态转移

时间:2024-07-17 18:30:01浏览次数:16  
标签:状态 小写字母 密码 int 55 KMP 转移

题目:

你现在需要设计一个密码S,S需要满足:

  1. S的长度是 N;
  2. S只包含小写英文字母;
  3. S不包含子串 T;

请问共有多少种不同的密码满足要求?
由于答案会非常大,请输出答案模 1e9+7的余数。

输入格式:
第一行输入整数N,表示密码的长度。
第二行输入字符串T,T中只包含小写字母。

输出格式:
输出一个正整数,表示总方案数模 109+7后的结果。

数据范围:
1≤N≤50,
1≤|T|≤N,|T|是T的长度。

分析:

关于是否包含子串的问题,可以使用kmp来尝试实现,另外此题涉及状态的转移,我们定义f[i][j]为密码设计到第i位时,T匹配到了第j位时的方案数,那么下一个状态f[i+1][t],t为通过kmp转移到的下一个的状态(T的下标),另外由于转移得到的状态与密码i+1位的小写字母是什么有关,我们可以通过枚举26个小写字母,计算出所有转移后可能的状态,一个状态可能有多个不同的状态转移得到,因为求的是方案数,我们需要累加,所以得到状态转移方程位f[i+1][t] += f[i][j]。

最终的答案是max(f[n][0~m-1]),m为不包含的子串的长度.

代码:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

int mod = 1e9 + 7;
int n;
char s[55];
int ne[55];
int f[55][55];

int main(){
    cin >> n >> s + 1;
    int m = strlen(s + 1);
    //求出ne数组,用于状态转移
    for(int i = 2, j = 0; i <= m; i ++){
        while(j && s[i] != s[j + 1]) j = ne[j];
        if(s[i] == s[j + 1])j ++;
        ne[i] = j;
    }
    
    f[0][0] = 1;
    for(int i = 0; i < n; i ++){
        for(int j = 0; j < m; j ++){
            for(char k = 'a'; k <= 'z'; k ++){
                //枚举每一个先前状态j和i位为k时,累加到转移后的状态。
                int u = j;
                while(u && k != s[u + 1])u = ne[u];
                if(k == s[u + 1])u ++;
                //因为密码中不能包含子串T,所以u<m时,才可以转移
                if(u < m) f[i+1][u] = (f[i+1][u] + f[i][j]) % mod;
            }
        }
    }
    int res = 0;
    for(int i = 0; i < m; i ++)res = (res + f[n][i]) % mod;
    cout << res;
}

标签:状态,小写字母,密码,int,55,KMP,转移
From: https://www.cnblogs.com/cjwfly/p/18308076

相关文章

  • HTTP请求五类状态码详细介绍,以及部分处理思路
    HTTP请求状态码分为五类: 一.消息系列二成功系列三.重定向系列四.请求错误系列五.服务器端错误系列302:临时转移成功,请求的内容已转移到新位置403:禁止访问500:服务器内部错误401代表未授权。以下是常见的一些状态码:1xx(信息性状态码)100Continue:继续,表明客......
  • 适用任意复杂转移函数及方程式的 matlab 二维曲线作图与客制化界面
    優點曲線可自行定義粗細,顏色,精細度......等等字可自行定義字體,顏色,大小,方向,位置......等等可自行定義虛線與字來標註曲線上的某一點此方法可延伸至matlab三維曲線或曲面作圖,亦或是同樣概念,但是改用其他程式諸如python來實現前情提要matlab現有表達轉移函數,......
  • 批量修改CS02 BOM状态
    DATA:lt_bomTYPETABLEOFtyp_out.DATA:lv_datumTYPEsy-datum,lv_messageTYPEchar128,lv_dateTYPEcsap_mbom-datuv.DATA:ls_stkoTYPEstko_api01,ls_warningTYPEcapiflag-flwarning,ls_stko2TYPEstk......
  • KMP
    CF1326D2Prefix-SuffixPalindrome(Hardversion)给你一个由小写英文字母组成的字符串\(s\)。请找出满足以下条件的最长字符串\(t\):\(t\)的长度不超过\(s\)的长度。\(t\)是一个回文字符串。存在两个字符串\(a\)和\(b\)(可能为空),使得\(t=a+b\)("\(+\)"表......
  • 转移Nuget目录
    以下是一段PS脚本,将C盘中的NUGET转移到D盘,并写入环境变量请首先输入以下命令,检查变量是否和我预定一致,`dotnetnugetlocalsall--list`如果一致,则直接用下面的脚本即可完成导入 #定义新的缓存路径$newHttpCachePath="D:\LocalCache\nuget\v3-cache"$newPackagesPath......
  • ChatGPT:为什么说 JWT 是无状态的,无法实现 Token 的作废,例如用户登出系统、修改密码等
    ChatGPT:为什么说JWT是无状态的,无法实现Token的作废,例如用户登出系统、修改密码等场景JWT(JSONWebToken)被称为无状态(stateless)是因为它本身不存储会话状态或会话数据在服务端。这意味着每个JWT包含了足够的信息来验证用户的身份和权限,而不需要在服务端存储任何关于......
  • KMP算法
    KMP算法KMP算法是一个字符串算法,通常用于匹配字符串。KMP算法的原理如果我们暴力枚举下标\(i,j\),\(i\)是文本串的下标,\(j\)是模式串(你要在文本串中匹配的字符串)的下标,时间复杂度\(O(NM)\),其中\(N,M\)分别为文本串和模式串的长度。我们看一下匹配过程:(gif动图请耐心观看)......
  • 2021 ICPC 网络赛 第二场 L Euler Function(势能线段树,欧拉函数,状态压缩)
    2021ICPC网络赛第二场LEulerFunction题意给定序列,定义两个操作\(l,r,x\)对区间\([l,r]\)的数乘\(x\)\(l,r\)求\(\sum\phi{a}_{i}\)思路注意欧拉函数的性质,若\(i\bmodp=0\),\(\phi(i*p)=p*\phi(i)\),否则\(\phi(i*p)=(p-1)*\phi(i)\)因为\(x,w\)的......
  • 解决 React 中 setInterval 无法更新状态的问题:长按加速的实现
    解决React中setInterval无法更新状态的问题:长按加速的实现在开发React应用时,我们经常会遇到需要定时更新组件状态的场景。setInterval是一个常用的定时器函数,但在React中使用它时,可能会遇到状态无法更新的问题。今天,我们就来深入探讨一下这个问题,并通过一个长按加速的例......
  • 通过MATLAB控制TI毫米波雷达的工作状态之TLV数据解析及绘制
    前言前一章博主介绍了如何基于设计视图中的这些组件结合MATLAB代码来实现TI毫米波雷达数据的实时采集。这一章将在此基础上实现TI毫米波雷达的TLV数据解析。过程中部分算法会涉及到一些简单的毫米波雷达相关算法,需要各位有一定的毫米波雷达基础。TLV数据之协议解析紧着上......