BZOJ 1009 [HNOI2008]GT考试 (KMP+矩阵乘法)
---恢复内容开始---
题目大意:给定一个由数字构成的字符串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+矩阵乘法)的更多相关文章
- 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 + 矩阵
原题描述: 阿申准备报名参加GT考试,准考证号为N位数 X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0<=Ai&a ...
- bzoj 1009 [HNOI2008]GT考试——kmp+矩阵优化dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 首先想到 确保模式串不出现 就是 确保每个位置的后缀不是该模式串. 为了dp,需要记录 ...
- BZOJ 1009: [HNOI2008]GT考试( dp + 矩阵快速幂 + kmp )
写了一个早上...就因为把长度为m的也算进去了... dp(i, j)表示准考证号前i个字符匹配了不吉利数字前j个的方案数. kmp预处理, 然后对于j进行枚举, 对数字0~9也枚举算出f(i, j) ...
- 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+矩阵乘法
Brief Description 给定一个长度为m的禁止字符串,求出长度为n的字符串的个数,满足: 这个字符串的任何一个字串都不等于给定字符串. 本题是POJ3691的弱化版本. Algorithm ...
- BZOJ1009: [HNOI2008]GT考试(KMP+矩阵乘法)
Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0< ...
- BZOJ.1009.[HNOI2008]GT考试(KMP DP 矩阵快速幂)
题目链接 设f[i][j]为当前是第i位考号.现在匹配到第j位(已有j-1位和A[]匹配)的方案数 因为假如当前匹配j位,如果选择的下一位与A[j+1]不同,那么新的匹配位数是fail[j]而不是0, ...
随机推荐
- Node-Blog整套前后端学习记录
Node-Blog 后端使用node写的一个一整套的博客系统 #### 主要功能 登录 注册 发表文章 编辑/删除文章 添加/删除/编辑文章分类 账号的管理 评论功能 ... 所用技术 node ex ...
- [poj2288] Islands and Bridges (状压dp)
Description Given a map of islands and bridges that connect these islands, a Hamilton path, as we al ...
- [poj 3318] Matrix Multiplication (随机化+矩阵)
Description You are given three n × n matrices A, B and C. Does the equation A × B = C hold true? In ...
- Gradle学习总结——抓重点学Gradle
前言 网上关于Gradle的教程很多,但很多都是以"面"切入- 通过大量讲解其用法及其API分类来阐述.但Gradle API使用技巧众多,API更是成千上百,臣妾记不住呀.个人深 ...
- 模拟ArrayList底层实现
package chengbaoDemo; import java.util.ArrayList; import java.util.Arrays; import comman.Human; /** ...
- Mysql提升大数据导入速度的绝妙方法
一.对于Myisam类型的表,可以通过以下方式快速的导入大量的数据. ALTER TABLE tblname DISABLE KEYS; loading the data A ...
- yii rbac管理
以下是Controller代码 <?php /** * Created by PhpStorm. * User: zhoukang * Date: 2017/6/11 * Time: 19:31 ...
- 洛谷——P1115 最大子段和
https://www.luogu.org/problem/show?pid=1115#sub 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 输入文件ma ...
- [Office]PPT 2013如何设置图片为半透明?
PPT里面似乎无法直接为图片设置透明度属性.下面是一种变通的办法. 1,插入一个和图片大小一致的图形(矩形):2,右键插入的矩形,然后在属性设置里选择“图片填充”,选择以需要的图片填充到该矩形里:3, ...
- Java笔试面试题001
Java笔试面试题之中的一个 1.Struts1中actionform和action属于MVC哪一层,为什么? 解答:actionform和action属于MVC的Model层,Action用来处理业 ...