---恢复内容开始---

题目大意:给定一个由数字构成的字符串A(len<=20),让你选择一个长度为n(n是给定的)字符串X,一个合法的字符串X被定义为,字符串X中不存在任何一段子串与A完全相同,求互不相同的合法的字符串L的数量

第一眼看就没啥思路....瞅了一眼题解,是KMP优化DP,然后再用矩阵优化DP

思路还是不难的,首先用KMP求出原字符串的next数组,再用next转移

定义f[i][j]是当前X串匹配到了第i位,已经匹配到了字符串A的第j位

每次在X串的第j+1位填上一个数c,那么X串现在最长能匹配上A串的位置

就是从第j+1位一直往前跳next,直到碰到一个位置a[k]==a[j]或k==0也匹配不到

 int k=i+;
for(k=i+;k>&&a[k]!=c;k=nxt[k])
;
pw.mp[k][i]++;

这是一个连续的过程,上面是构建矩阵的核心代码(原来的代码太丑了我改了一下)

至于为什么要这么跳呢,这是一个类似于"贪心"的过程,但并不是我们主动去贪心

因为我们要保证每次转移的位置都是正确的

然后发现N<=1e9有点大,矩阵乘法优化一下即可

 #include <map>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
#define N 23
#define ui unsigned int
#define inf 0x3f3f3f3f
using namespace std;
//re
int n,len;
ui mod;
char str[N];
int a[N],nxt[N];
struct mtx{
ui mp[N][N];
friend mtx operator *(const mtx &s1,const mtx &s2)
{
mtx ret;memset(&ret,,sizeof(ret));
for(int i=;i<len;i++)
for(int j=;j<len;j++)
for(int k=;k<len;k++)
(ret.mp[i][j]+=(s1.mp[i][k]*s2.mp[k][j])%mod)%=mod;
return ret;
}
mtx qpow(mtx &ans,mtx &x,int y)
{
while(y){
if(y&) ans=x*ans;
x=x*x;y>>=;
}
}
}M;
void get_kmp()
{
int i=,j=;
nxt[]=;
while(i<=len)
if(j==||a[i]==a[j])
i++,j++,nxt[i]=j;
else j=nxt[j];
} int main()
{
scanf("%d%d%u",&n,&len,&mod);
scanf("%s",str+);
for(int i=;i<=len;i++) a[i]=str[i]-'';
get_kmp();
mtx pw;memset(&pw,,sizeof(pw));
for(int i=;i<len;i++)
for(int c=;c<=;c++)
{
if(i==len-&&a[len]==c) continue;
int k=i+;
for(k=i+;k>&&a[k]!=c;k=nxt[k]);
pw.mp[k][i]++;
}
mtx ret;memset(&ret,,sizeof(ret));
ret.mp[][]=;
M.qpow(ret,pw,n);
ui ans=;
for(int i=;i<len;i++)
(ans+=ret.mp[i][])%=mod;
printf("%u\n",ans);
return ;
}

---恢复内容结束---

BZOJ 1009 [HNOI2008]GT考试 (KMP+矩阵乘法)的更多相关文章

  1. BZOJ 1009 [HNOI2008]GT考试 (KMP + 矩阵快速幂)

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4266  Solved: 2616[Submit][Statu ...

  2. bzoj 1009: [HNOI2008]GT考试 -- KMP+矩阵

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数X1X2.. ...

  3. 题解:BZOJ 1009 HNOI2008 GT考试 KMP + 矩阵

    原题描述: 阿申准备报名参加GT考试,准考证号为N位数 X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0<=Ai&a ...

  4. bzoj 1009 [HNOI2008]GT考试——kmp+矩阵优化dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 首先想到 确保模式串不出现 就是 确保每个位置的后缀不是该模式串. 为了dp,需要记录 ...

  5. BZOJ 1009: [HNOI2008]GT考试( dp + 矩阵快速幂 + kmp )

    写了一个早上...就因为把长度为m的也算进去了... dp(i, j)表示准考证号前i个字符匹配了不吉利数字前j个的方案数. kmp预处理, 然后对于j进行枚举, 对数字0~9也枚举算出f(i, j) ...

  6. BZOJ 1009 HNOI2008 GT考试 KMP算法+矩阵乘法

    标题效果:给定的长度m数字字符串s.求不包括子s长度n数字串的数目 n<=10^9 看这个O(n)它与 我们不认为这 令f[i][j]长度i号码的最后的字符串j位和s前者j数字匹配方案 例如,当 ...

  7. [bzoj1009][HNOI2008]GT考试——KMP+矩阵乘法

    Brief Description 给定一个长度为m的禁止字符串,求出长度为n的字符串的个数,满足: 这个字符串的任何一个字串都不等于给定字符串. 本题是POJ3691的弱化版本. Algorithm ...

  8. BZOJ1009: [HNOI2008]GT考试(KMP+矩阵乘法)

    Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0< ...

  9. BZOJ.1009.[HNOI2008]GT考试(KMP DP 矩阵快速幂)

    题目链接 设f[i][j]为当前是第i位考号.现在匹配到第j位(已有j-1位和A[]匹配)的方案数 因为假如当前匹配j位,如果选择的下一位与A[j+1]不同,那么新的匹配位数是fail[j]而不是0, ...

随机推荐

  1. nyoj124-中位数

    中位数 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 一组数据按从小到大的顺序依次排列,处在中间位置的一个数叫做中位数. 比如 1 5 10 11 9  其中位数就是9 ...

  2. [ZOJ]3541 Last Puzzle (区间DP)

    ZOJ 3541 题目大意:有n个按钮,第i个按钮在按下ti 时间后回自动弹起,每个开关的位置是di,问什么策略按开关可以使所有的开关同时处于按下状态 Description There is one ...

  3. https自签证书

    linux自带openssl,所以最好在linux平台操作 第一步:生成采用des3算法保护的私钥:openssl genrsa -des3 -out private-rsa.key 1024 命令执 ...

  4. C/C++ 图像二进制存储与读取

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50782792 在深度学习时,制作样本数 ...

  5. poj 2955 区间dp入门题

    第一道自己做出来的区间dp题,兴奋ing,虽然说这题并不难. 从后向前考虑: 状态转移方程:dp[i][j]=dp[i+1][j](i<=j<len); dp[i][j]=Max(dp[i ...

  6. wcf的Contract中name的使用

    name可以自定义,Contract中的name会更改soap消息中的名称,虽然不影响在服务端代码中的使用 可以看到,在后台代码中使用函数的重用进行编写代码是非常方便的

  7. JavaSript 基础学习笔记

    1. 数组 对象数组 var temp = [{"name":"123","age":"18"},{"name ...

  8. 多播 & multicast

    参考: http://blog.csdn.net/herbert5069/article/details/31358641

  9. VC6 编译和使用 STLPort

    1.下载 STLport:   http://www.stlport.org/   http://downloads.sourceforge.net/project/stlport/STLport/S ...

  10. PDF转EPUB格式电子书经验总结

    依据本人将PDF转换为EPUB电子书的经验,总结整理了这篇文章.因本人水平有限,难免有错误和不足之处,望大家及时批评指正.   写这篇文章时,假定读者已经会使用文中所列出软件的基本操作,比方如何用No ...