这道题机房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. MUI功能列表

    打开App引导页面 - http://www.bcty365.com/content-146-4970-1.html 页面传值   - http://www.bcty365.com/content-1 ...

  2. Linux上安装Mysql+Apache+Php

    一.安装Mysql 1.卸载默认的mysql yum -y remove mysql-libs-* Removed:  mysql-libs.x86_64 0:5.1.73-3.el6_5 卸载成功 ...

  3. 第一个c++程序 helloworld

    // helloworld.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h"#include "iostream" int ...

  4. 学java入门到精通,不得不看的15本书

    学java入门到精通,不得不看的15本书 一.Java编程入门类1.<Java编程思想>2.<Agile Java>中文版 二.Java编程进阶类1.<重构 改善既有代码 ...

  5. 1.6.5 Updating Parts of Documents

    1. Updating Parts of Documents 有时候你想要直接改变solr文档中的部分内容,solr有两种合适的方法来改变. 第一种:自动更新,这个方法允许仅仅改变文档的一个或者几个字 ...

  6. JSF HelloWord

    JSF(Java Server Faces)是一种用于构建Web应用程序的新标准Java框架.提供了一种以组件为中心来开发Java Web的用户界面的方法,从而简化了开发.   JSF是Java We ...

  7. In-Memory:Hash Index

    SQL Server 2016支持哈希查找,用户可以在内存优化表(Memory-Optimized Table)上创建Hash Index,使用Hash 查找算法,实现数据的极速查找.在使用上,Has ...

  8. 【Android Api 翻译3】android api 完整翻译之Application Fundamentals (学习android必须知道的)

    Android应用程序是用Java编程语言编写的.Android SDK工具把应用程序的代码.数据和资源文件一起编译到一个Android程序包中(这个程序包是以.apk为后缀的归档文件),一个Andr ...

  9. jQuery中的渐变动画效果

    jQuery中的渐变动画效果jQuery中的渐变动画效果

  10. freeCodeCamp:Sorted Union

    写一个 function,传入两个或两个以上的数组,返回一个以给定的原始数组排序的不包含重复值的新数组. 换句话说,所有数组中的所有值都应该以原始顺序被包含在内,但是在最终的数组中不包含重复值. 非重 ...