这道题机房n多人好久之前就A了…… 我到现在才做出来……

一看就是DP+矩阵乘法,但是一开始递推式推错了…… 正确的递推式应该是二维的……

  f[i][j] 表示第准考证到第 i 位匹配了 j 位的方案数

  f[i][j] = f[i][j-1] + f[i][k]  第k位可以转移到第 j 位

这就需要枚举 当前位是什么, 同是还需要求一个关于m 的KMP 就可以了

  上代码:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define M 25
using namespace std; int n, m;
long long f[M] = {}, yu;
long long a[M][M] = {}, b[M][M] = {}, c[M][M];
int next[M] = {};
char s[M]; void make_next()
{
int i = , j = -;
next[] = -;
while (i < m-)
if (j == - || s[i] == s[j])
{
i++; j++;
next[i] = j;
}
else j = next[j];
} void cheng()
{
for (int i = ; i < m; ++i)
for (int j = ; j <= m; ++j)
c[i][j] = ;
for (int i = ; i < m; ++i)
for (int j = ; j < m; ++j)
for (int k = ; k < m; ++k)
c[i][j] = (c[i][j] + a[i][k] * b[k][j]) % yu;
swap(c, b);
} void fan()
{
for (int i = ; i < m; ++i)
for (int j = ; j <= m; ++j)
c[i][j] = ;
for (int i = ; i < m; ++i)
for (int j = ; j < m; ++j)
for (int k = ; k < m; ++k)
c[i][j] = (c[i][j] + a[i][k] * a[k][j]) % yu;
swap(c, a);
} void mi(int n)
{
for (int i = ; i < m; ++i)
b[i][i] = ;
while (n)
{
if (n & ) cheng();
n >>= ;
fan();
}
swap(a, b);
} int main()
{
scanf("%d%d%I64d", &n, &m, &yu);
scanf("%s", s);
make_next();
f[] = ;
for (int i = ; i < m; ++i) //已经匹配 i 位 正在匹配第 i+1 位
{
for (int j = ''; j <= ''; ++j) // 第 i+1 位是 j
if (j == s[i]) a[i+][i] ++; // success
else // fail find the last can pipei
{
int x = next[i];
while (x != - && s[x] != j)
x = next[x];
a[x+][i] ++;
}
}
mi(n);
long long ans = ;
for (int i = ; i < m; ++i)
{
long long zan = ;
for (int j = ; j < m; ++j)
zan = (zan + f[j] * a[i][j]) % yu;
ans = (ans + zan) % yu;
}
printf("%I64d\n", ans);
}

bzoj 1009:[HNOI2008]GT考试的更多相关文章

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

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

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

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

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

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

  4. [BZOJ 1009] [HNOI2008] GT考试 【AC自动机 + 矩阵乘法优化DP】

    题目链接:BZOJ - 1009 题目分析 题目要求求出不包含给定字符串的长度为 n 的字符串的数量. 既然这样,应该就是 KMP + DP ,用 f[i][j] 表示长度为 i ,匹配到模式串第 j ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 【iOS开发必备指南合集】申请企业级IDP、真机调试、游戏接入GameCenter 指南(实现仿官方的成就提示)、游戏接入OpenFeint指南;

    本站文章均为李华明Himi原创,转载务必在明显处注明:(作者新浪微博:@李华明Himi) 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-c ...

  2. centos 服务器配置(一) 之端口占用

    1.查找被占用的端口 netstat -tln netstat -tln | grep 8060 netstat -tln 查看端口使用情况,而netstat -tln | grep 8060则是只查 ...

  3. C++删除字符串中特定的字符

    原文:https://snipt.net/aolin/c-6/ //处理string类型的方法del_sp(string &str)待测试 //处理C-Style的方法可用,可以考虑将该方法改 ...

  4. 分享一款页面视差滚动切换jquery.localscroll插件

    今天给大家分享一款页面视差滚动切换jquery.localscroll插件. 滚动鼠标液动条看下页面的切换效果.该插件适用浏览器:IE8.360.FireFox.Chrome.Safari.Opera ...

  5. Steps to Install Hadoop on CentOS/RHEL 6---reference

    http://tecadmin.net/steps-to-install-hadoop-on-centosrhel-6/# The Apache Hadoop software library is ...

  6. Android(java)学习笔记267:Android线程池形态

    1. 线程池简介  多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.     假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...

  7. Ultra Edit常用正则表达式

    一.怎样可以删除包含特殊字符的行? 你可以用正则表示式全部替换命令替换行中包含的字符.要执行这个操作,你应该先进行查找: 查找: %*YOUR STRING*^p 替换为: (随便什么文字) 帮助文件 ...

  8. 【Linux】gdb调试core文件

    编写服务器端程序,很容易遇到Crash问题,比较幸运的是Linux提供了core file,保留了Crash的现场.有时候,根据当前的调用栈,并且打印出当前栈的变量就可以分析出crash的原因,但是, ...

  9. 剑指Offer11 在O(1)内删除链表结点

    /************************************************************************* > File Name: 11_Delete ...

  10. Understand

    快捷键: Ctrl+Shift+H 折叠 Ctrl+Alt+F 替换