BZOJ 1009: [HNOI2008]GT考试(kmp+dp+矩阵优化)
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+矩阵优化)的更多相关文章
- BZOJ.1009.[HNOI2008]GT考试(KMP DP 矩阵快速幂)
题目链接 设f[i][j]为当前是第i位考号.现在匹配到第j位(已有j-1位和A[]匹配)的方案数 因为假如当前匹配j位,如果选择的下一位与A[j+1]不同,那么新的匹配位数是fail[j]而不是0, ...
- BZOJ 1009 HNOI2008 GT考试 KMP算法+矩阵乘法
标题效果:给定的长度m数字字符串s.求不包括子s长度n数字串的数目 n<=10^9 看这个O(n)它与 我们不认为这 令f[i][j]长度i号码的最后的字符串j位和s前者j数字匹配方案 例如,当 ...
- [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂)
[BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂) 题面 阿申准备报名参加GT考试,准考证号为N位数X1X2-.Xn,他不希望准考证号上出现不吉利的数字.他的不吉利数学A ...
- BZOJ 1009 [HNOI2008]GT考试 (KMP + 矩阵快速幂)
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4266 Solved: 2616[Submit][Statu ...
- bzoj 1009: [HNOI2008]GT考试 -- KMP+矩阵
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数X1X2.. ...
- bzoj 1009 [HNOI2008]GT考试——kmp+矩阵优化dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 首先想到 确保模式串不出现 就是 确保每个位置的后缀不是该模式串. 为了dp,需要记录 ...
- BZOJ 1009 [HNOI2008]GT考试 (KMP+矩阵乘法)
---恢复内容开始--- 题目大意:给定一个由数字构成的字符串A(len<=20),让你选择一个长度为n(n是给定的)字符串X,一个合法的字符串X被定义为,字符串X中不存在任何一段子串与A完全相 ...
- bzoj 1009 [HNOI2008]GT考试(DP+KMP+矩阵乘法)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1009 [题意] 给定一个字符串T,问长度为n且不包含串T的字符串有多少种. [思路] ...
- 【BZOJ】1009: [HNOI2008]GT考试(dp+矩阵乘法+kmp+神题)
http://www.lydsy.com/JudgeOnline/problem.php?id=1009 好神的题orzzzzzzzzzz 首先我是连递推方程都想不出的人...一直想用组合来搞..看来 ...
- 题解:BZOJ 1009 HNOI2008 GT考试 KMP + 矩阵
原题描述: 阿申准备报名参加GT考试,准考证号为N位数 X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0<=Ai&a ...
随机推荐
- 苹果copy等其他的英文改成中文
程序plist有个参数localization native development region改成china
- java8,方法引用
1:方法引用,https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html 当我们使用lambda表达式去创建一个 ...
- sencha touch调试时Please close other application using ADB: Monitor, DDMS, Eclipse
1.运行——cmd—— netstat -aon|findstr "5037" 2.打开任务管理器,查看所有进程 显示进程pid(文件-查看)--查找pid=7740的结束.
- 172. Factorial Trailing Zeroes(阶乘中0的个数 数学题)
Given an integer n, return the number of trailing zeroes in n!. Example 1: Input: 3 Output: 0 Explan ...
- ac1066
经过分析后的二分 题目是 Josnch星球是一个赌博之风盛行的星球.每个人一出生就有一定数额的钱,之后的所有收入只能由赌博获得(OMG,如果RP不好,输光了所有的 钱...)假设赌博公司的某场赌博有N ...
- Intro to Python for Data Science Learning 3 - functions
Functions from:https://campus.datacamp.com/courses/intro-to-python-for-data-science/chapter-3-functi ...
- 使用 amcharts 和 highcharts 绘制多曲线时间趋势图的通用方法
工作中用到, 这里分享一下. 可以使用 amcharts 和 highcharts 在同一坐标中绘制多个对比曲线图. 当然, 对图形没有过多装饰, 可以参考 API 文档: highcharts: ...
- Hive 常用函数汇总
Hive内部提供了很多函数给开发者使用,包括数学函数,类型转换函数,条件函数,字符函数,聚合函数,表生成函数等等,这些函数都统称为内置函数. 目录 数学函数 集合函数 类型转换函数 日期函数 条件函数 ...
- python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍
python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍 IDLE默认不能显示行号,使用ALT+G 跳到对应行号,在右下角有显示光标所在行.列.pycharm免费社区版.Su ...
- win7 xampp 验证码,session出不来的问题
win7 xampp 验证码,session出不来的问题 需要在前面加上全路径,如:"\xampp\tmp" 变成"D:\xampp\tmp" Warning: ...