http://www.lydsy.com/JudgeOnline/problem.php?id=1009

题意:

思路:
真的是好题啊!

对于这种题目,很有可能就是dp,$f[i][j]$表示分析到第 i 位时匹配了不吉利数字的前 j 位,那么对于第i+1位来说,它有3种情况:

①加入第i +1位后,和不吉利数字不匹配了,也就是变成了$f[i+1][0]$。

②这种情况还是不匹配,但是它不回到0,这个就是kmp,这样一说是不是想明白了。

③继续匹配,也就是$f[i+1][j+1]$。

这个计算的话可以用矩阵来加速:

$a[i][j]$表示从匹配i个数变到匹配j个数的方法数。$a[i][j]$的初始化就靠kmp来完成了。

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<sstream>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<int,ll> pll;
const int INF = 0x3f3f3f3f;
const int maxn=+; int n, m, mod;
char s[];
int nxt[maxn]; struct Matrix
{
int mat[][];
Matrix operator *(Matrix a)
{
Matrix c;
for(int i=;i<m;i++)
{
for(int j=;j<m;j++)
{
c.mat[i][j]=;
for(int k=;k<m;k++)
c.mat[i][j]=(c.mat[i][j]+mat[i][k]*a.mat[k][j])%mod;
}
}
return c;
}
}base,a; void qpow(int n)
{
for(int i=;i<m;i++)
{
a.mat[i][i]=;
for(int j=i+;j<m;j++)
a.mat[i][j]=a.mat[j][i]=;
} while(n)
{
if(n&) a=a*base;
base=base*base;
n>>=;
}
} void get_next()
{
int i = -, j = ;
nxt[] = -;
while (j < m)
{
if (i == - || s[i] == s[j])
nxt[++j] = ++i;
else
i = nxt[i];
}
} void kmp()
{
memset(base.mat,,sizeof(base.mat)); for(int i=;i<m;i++)
{
for(char j='';j<='';j++)
{
int k=i;
while(k && s[k]!=j) k=nxt[k];
if(s[k]==j) k++;
if(k!=m) base.mat[i][k]++;
}
}
} int main()
{
//freopen("in.txt","r",stdin);
while(~scanf("%d%d%d%s",&n,&m,&mod,s))
{
get_next();
kmp();
qpow(n);
int ans=;
for(int i=;i<m;i++)
ans=(ans+a.mat[][i])%mod;
printf("%d\n",ans);
}
return ;
}

BZOJ 1009: [HNOI2008]GT考试(kmp+dp+矩阵优化)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. BZOJ 1009 [HNOI2008]GT考试 (KMP+矩阵乘法)

    ---恢复内容开始--- 题目大意:给定一个由数字构成的字符串A(len<=20),让你选择一个长度为n(n是给定的)字符串X,一个合法的字符串X被定义为,字符串X中不存在任何一段子串与A完全相 ...

  8. bzoj 1009 [HNOI2008]GT考试(DP+KMP+矩阵乘法)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1009 [题意] 给定一个字符串T,问长度为n且不包含串T的字符串有多少种. [思路] ...

  9. 【BZOJ】1009: [HNOI2008]GT考试(dp+矩阵乘法+kmp+神题)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1009 好神的题orzzzzzzzzzz 首先我是连递推方程都想不出的人...一直想用组合来搞..看来 ...

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

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

随机推荐

  1. UIImage添加滤镜

    UIImage *image =[UIImage imageNamed:"]; NSArray *arr = [NSArray arrayWithObjects:@"CISRGBT ...

  2. MySQL完全卸载方法

    1.在控制面板里把Mysql正常卸载 2.C:\Documents and Settings\All Users\Application Data\MySQL 这里还有MySQL的文件,必须要删除 注 ...

  3. plsql的sql窗口中文模糊查询没有作用

    环境变量新增: NLS_LANG = AMERICAN_AMERICA.AL32UTF8

  4. 阻止提交按钮的默认 action

    使用 preventDefault() 函数来阻止对表单的提交. 示例代码如下: <html><head><script type="text/javascri ...

  5. ID和Name

    ID和Name都可以用来标识一个标记,Javascript分别有两个方法getElementById和getElementByName来定位Dom节点. 区别如下: 1.我们知道在网页做Post提交时 ...

  6. [LeetCode] 285. Inorder Successor in BST_Medium tag: Inorder Traversal

    Given a binary search tree and a node in it, find the in-order successor of that node in the BST. No ...

  7. 你应该知道的最好Webmail邮件客户端,

    1 . Kite Kite is an opensource replacement to Gmail. Kite is a webmail designed to look a lot like g ...

  8. 转载 vsftpd安装

    http://blog.csdn.net/shutfuckingup/article/details/8250290 1:安装vsftpd    yum install vsftpd 2:关闭防火墙 ...

  9. 关于VS2010的帮助文档更改路径

    不小心把MSDN装在系统盘怎么办? 由于自己的C盘空间比较有限,所以经常需要把软件安装在其他磁盘,比如E盘,但是这次重装却不小心就装在C盘了,特遗憾,偶然在网上找到可以更改路径的方法,自己试试,成功了 ...

  10. Python:slice与indices

    slice: eg: >>>e=[0,1,2,3,4,5,6] >>>s=slice(2,3) >>>e[s] [2] slice的区间左闭右开[ ...